레퍼런스 : https://velog.io/@max9106/Spring-Boot-JPA-MySQL-%EA%B2%8C%EC%8B%9C%EA%B8%80-%EC%9E%91%EC%84%B1%EA%B8%B0%EB%8A%A5
프로젝트 전체 소스코드 : https://github.com/rawfishthelgh/boardcrud.git
- Handler 구현
- 핸들러는 어떠한 url 요청에 대응해 실행할 기능을 매핑하는 것이다.
- controller 이름의 패키지 생성후 BoardController라는 이름의 클래스를 만들어준다. 이 클래스를 통해 핸들러를 구현할 것이다.
- 클래스 맨 위에 @Controller 애노테이션을 추가해준다 @Controller는 어떤 url 요청에 대해 view, 혹은 data를 반환해주는 기능을 갖는다.(출처: https://mangkyu.tistory.com/49)
- @GetMapping을 통해 루트요청("/")일 경우, 메인페이지(list.html)로 연결, "/post" 요청 시 write.html로 연결해준다.
- 로컬 8080 포트에 접속하면 해당 view가 렌더링되는 것을 볼수 있다.
- 다음과 같이 BoardService,BoardDto 클래스를 생성하고
- Service를 컨트롤러에 주입받아서 사용할 것이다.
* Service : 실제 비즈니스 로직을 수행
- repository를 이용하여 실제로 데이터를 담을 것이다. 따라서 먼저 Entity와 Repository를 만들어줘야한다.
* repository : 데이터를 저장하는 곳
- domain 패키지에 Board,TimeEntity 클래스와, BoardRepository 인터페이스 생성
- TimeEntity는 데이터 조작 시 자동으로 날짜를 수정해주는 JPA의 Auditing 기능을 사용하게 해 준다.
- lombok의 @Getter 애노테이션으로 getter 기능을 선언하지 않아도 사용할 수 있다.
- @MappedSuper클래스를 사용하면 엔티티 중 반복되는 속성(여기서는 생성/수정일)을 미리 선언해놓고 엔티티 선언시 이를 상속받기만 하면 된다.(참고 : https://ict-nroo.tistory.com/129)
- @EntityListeners를 사용해 JPA Entity에서 이벤트가 발생할 때마다 특정 로직을 실행시킬 수 있다. AuditingEntityListener.class를 파라미터로 넣어주면 해당 클래스에 Auditing 기능을 포함한다는 것을 jpa에게 알려준다.
- @Column 애노테이션은 엔티티 클래스의 내부변수로 정의되며 db 테이블의 내용과 동일하게 1대1로 매칭된다.
- @CreatedDate, @LastModifiedDate는 글자 그대로 생성/최근수정시각을 변수에 담아준다.
- 그리고 JPA Auditing 기능을 사용하기 위해서는 반드시 main 클래스에 @EnableJpaAuditing 애노테이션을 붙여준다.
- 이제 객체를 저장할 BoardRepository를 생성해준다.
- JpaRepository 인터페이스에는 미리 검색 메소드가 정의되어 있다.이 메소드들을 호출하여 엔티티에 있는 데이터를 조회/생성/삭제를 할 수 있다. extends JpaRepository <엔티티 클래스이름 , ID 필드 타입> 형식으로 지정해 상속받아 사용한다. (참고 : https://akdl911215.tistory.com/307)
- 이제 BoardRepository를 이용해, 실제로 비즈니스 로직을 수행할 service를 구현할 것이다. 객체가 저장되는 기능을 수행할 savepost를 생성한다.
- write form에서 내용을 쓰고 등록을 누르면 post요청이 오고, BoardService의 savePost를 실행하게된다.
- savePost는 Repository를 이용해 데이터를 저장한다.
(repository의 save는 JpaRepository -> PagingAndSortingRepository -> CrudRepository 의 인터페이스이다.)
- @Service 어노테이션을 붙이면 클래스가 핸들러가 스캔할 수 있는 빈(Bean) 객체가 되어 서블릿용 컨테이너에 생성된다. 즉 스프링에서 관리하는 객체임을 알려주는 것이다(이는 본래 @Component의 용도). 서비스 레이어에서 내부 자바 로직을 처리한다. 비즈니스 로직이나 respository layer 호출하는 함수에 사용된다.(참고 : https://baek-kim-dev.site/64, https://codevang.tistory.com/258)
- @Transactional은 클래스나 메서드에 붙여줄 경우, 해당 범위 내 메서드가 트랜잭션이 되도록 보장해준다. (참고 : https://kafcamus.tistory.com/30)'
- 테이블에 객체가 잘 등록된 것을 확인 가능하다.