스프링 부트란? 스프링과 스프링 부트의 차이
:
스프링 부트를 공부하며 게시판 만들기 를 진행한다.
- 스프링 부트 2.6.7
- 자바 11
- 인텔리제이 IDEA
- Gradle , Lombok, JPA, ,Mustache, Web, H2
웹 서비스는 클라이언트와 서버의 요청과 동작으로 이루어진다.
스프링은 /resources/static 내부에 있는 html 파일을 불러오게 된다.
Mustach 는 view template 를 만드는 도구이다. 정적 html 파일? 느낌 .. 변수는 {{}} 로 처리한다.
/resources/tamplates 폴더에 .mustache 타입으로 생성 >> ( mustache 플러그인 설치 선수)
뷰를 보기 위해서는 컨트롤러가 필요하며 이는 기본 패키지 내부에 controller 패키지를 생성하고
내부에 ~~controller.java 클래스 파일을 만들어 사용한다.
클래스명 위에 @Controller 어노테이션을 추가해 컨트롤러임을 선언하며
@GetMapping("/url") 을 통해 접속할 url 을 설정해준다.
그리고 return 파일명; 을 통해 파일명.templates를 출력한다.
파라미터로 Model model 을 추가하여서 변수를 등록할 수 있다.
model.addAttribute("변수명", "변수값");
모델이 변수값을 변수명에 대입해서 보내준다.
_참고
html 형식의 경우 {{>~/~}} 를 이용해 footer 와 header 를 간단히 표시 가능
부트 스트랩을 이용해 html 형식 편하게 설정 가능
<fom>
html 요소 form 태그에 담긴 데이터로 어디로? 어떻게 보낼지에 대한 내용이 필요하다.
어디로 > action =" url "
어떻게 > method = "post"
>> controller 내부에 @PostMapping("")
이런 내용이 전송이되고 controller 는 이 데이터를 DTO 를 통해 받는다.
dto 는 컨트롤러와 동일 레벨에 패키지를 추가하고 내부에 생성한다.
dto 내부에는 받고자 하는 변수명을 설정 ( 생성자와 toString() 필요 )
JPA
DB는 자바 언어를 모른다 > JPA 를 통해 자바로 DB에 명령을 전달한다.
- Entity : 자바 객체를 DB 가 이해할 수 있게 잘 규격화 된 DATA
- Repository : Entity 는 repository 를 이용해 DB 에게 전달, 처리 된다.
1. DTO 를 Entity 로 변환
Article article = form.toEntity(); // form 은 DTO
Article 클래스는 entity 라는 패키지를 생성 후 내부에 만든다. > @Entitly 로 DB 가 해당 객체를 인식가능하게 하고,
Entity 에는 대표값을 넣어줘야 한다.
@Entity // DB 가 해당 객체를 인식 가능하게
@AllArgsConstructor
@ToString
@NoArgsConstructor // 디폴트 생성자 추가
public class Article {
@Id // 대표값을 지정
@GeneratedValue // 자동 생성 어노테이션
private Long id; // 대표값을 넣어줘야 함
@Column // DB 테이블에 연결되게
private String title;
@Column
private String content;
}
toEntity 는 dto 내에 아래 코드를 삽입해 준다. 벼수값에 맞게
public Article toEntity() {
return new Article(null, title, content);
}
}
2. Repository 에게 Entity 를 DB 안에 저장하게 한다.
Article saved = articleRepository.save(article);
컨트롤러에 필드에 (클래스 내에) 아래 코드 삽입
@Autowired // 스프링 부트가 미리 생성해놓은 객체를 자동 연결
private ArticleRepository articleRepository;
repository 는 패키지를 생성 후 내부에 인터페이스 파일을 생성해준다.
JPA 에서 제공하는 Repository 인터페이스를 사용해 아래 코드와 같이 간단하게 생성해준다. CRUD
public interface ArticleRepository extends CrudRepository<Article, Long> {}
// < 관리대상 entity, 기본값 타입 >
Lombok 과 리팩토링
Lombok : 코드 간소화 도구
> 필수코드의 반복을 최소하하고 로깅을 통해 println 간소화 + 기록 을 남길수 있다.
@AllArgsConstructor // 롬복을 이용해 생성자 제거
@ToString // 롬복을 이용해 ToStirng 메서드 제거
//System.out.println(form); > 로깅으로 대체
log.info(form.toString());
로깅을 사용할 때는 @Slf4j 어노테이션을 사용해주어야 함.
: 실제 서버에서는 println 을 사용하지 않는다.
로깅을 이용하면 데이터가 컨트롤러의 로그 기록에 찍힌다. (다양한 정보 제공 )
URL 요청받기 - PathVariable
@GetMapping("/articles/{id}") // 변수인 id 페이지
public String show(@PathVariable Long id, Model model){ //(URL path 로 부터 변수 입력 + 모델사용)
//1 id로 데이터를 가져오고 repository.findbyid 이용
Article articleEntity = articleRepository.findById(id).orElse(null); // ENTITY에 id 값이 없으면 null 반환
//2 가져온 데이터를 모델에 등록하고
model.addAttribute("article", articleEntity);
//3 보여줄 페이지를 설정한다.
return "articles/show";}
웹의 동작 원리와 MVC 패턴
스프링의 MVC 패턴은 Model, View, Controller 의 동작을 의미한다.
View는 화면을 Controller 는 처리를 Model 은 데이터 관리를 한다.
1. 사용자가 브라우저를 통해 data 를 요청한다.
2. controller 가 요청 url 을 받아 찾고자 하는 data 를 정보로 전달한다.
3. Repository 가 DB 에게 data 를 요청한다
4. DB 는 data 를 entity 로 반환한다.
5. entity는 다시 Repository > controller > Model > View 를 거쳐 사용자에게 결과페이지를 전달한다.