[spring 토이프로젝트] 게시판 crud, 검색, 페이징 구현- 2. 게시글 작성

이건회·2022년 7월 26일
0

spring게시판1

목록 보기
2/6

레퍼런스 : 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가 렌더링되는 것을 볼수 있다.

  • 이제 /post 템플릿에서 등록 버튼을 누를때 POST요청이 날아오면, 실제로 db에 이를 등록시켜야 한다.
    *DTO란 : Data Transfer Object, 웹 서비스의 클라이언트와 서버, 더 자세히는 클라이언트와 서버의 서비스 계층 사이에서 교환되는 데이터를 담는 그릇.(참고할 내용 : https://studyandwrite.tistory.com/402, https://gardeny.tistory.com/7, https://jihyee.tistory.com/14, ) (Controller와 Service 사이에서 강한 의존을 방지하기 위해서 DTO를 사용)-> 근데 컨트롤러는 왜 서비스에 의존하면 안 되는가?
  • Post방식의 요청을 받아, Service에서 이를 처리하도록 할 것이다.
  • Dto를 사용해 Controller와 Service 사이에서 데이터를 주고 받을 것이다.

  • 다음과 같이 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에게 알려준다.
  • JPA Auditing : Spring Data JPA에서 시간에 대해서 자동으로 값을 넣어주는 기능, 어떤 객체에 대해 생성/수정 시간 값을 정확히 기록해준다.(참고 : https://webcoding-start.tistory.com/53)
  • @Column 애노테이션은 엔티티 클래스의 내부변수로 정의되며 db 테이블의 내용과 동일하게 1대1로 매칭된다.
  • @CreatedDate, @LastModifiedDate는 글자 그대로 생성/최근수정시각을 변수에 담아준다.

  • 그리고 JPA Auditing 기능을 사용하기 위해서는 반드시 main 클래스에 @EnableJpaAuditing 애노테이션을 붙여준다.

  • 메인 엔티티인 Board 클래스를 생성해준다.
  • @Entity 어노테이션을 클래스에 선언하면 그 클래스는 JPA가 관리한다.(@Entity만 사용했을 경우 DB와 연결 시 테이블명은 클래스명과 동일하게 설정된다)
    (@Entity와 @Table의 차이 : https://wakestand.tistory.com/689,
    https://www.inflearn.com/questions/75556)
  • @NoArgsConstructor를 사용하면 파라미터가 없는 기본 생성자를 생성한다. 이 때 AccessLevel.PROTECTED를 사용시 항상 완전한 형태의 객체만을 생성할 수 있다.(argument 누락 시 오류...맞나?)(참고 : https://cobbybb.tistory.com/14)
  • @Id 애노테이션은 jpa 엔티티 객체의 식별자, 즉 기본키로 사용할 필드에 적용한다.(참고 : https://dololak.tistory.com/425)
  • @ID 옆에 @GeneratedValue를 설정하면 기본키가 되는 ID값은 따로 생성하지 않아도 자동으로 생성된다. 네 가지 생성 전략을 지정할 수 있는데, 기본은 AUTO(데이터베이스의 dialect 타입에 따라 나머지 IDENTITY, SEQUENCE, TABLE 방식이 지정)이다.(참고 : https://whitepro.tistory.com/405)
    * dialect : 현재 사용하고 있는 db(여기서는 MySql) (참고 : https://firework-ham.tistory.com/106)
  • @Builder를 사용하면 선언한 클래스의 객체를 만들 때 build() 메소드를 사용해 객체를 생성할 수 있는데, 빌더를 사용하면 set하지 않은 객체를 생성할 시 nullPointerExcetpion을 발생시켜준다.(참고 : https://esoongan.tistory.com/82)

  • 이제 객체를 저장할 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)'

  • Controller와 Service 사이에서 데이터를 주고 받는 DTO를 구현
  • @ToString 어노테이션을 적용하면 객체가 가진 정보나 값을 자동으로 문자열로 바꿔주는 toString() 메소드를 사용할 수 있다.(참고 : https://www.daleseo.com/lombok-popular-annotations/)

  • 실제로 글을 작성한 후 등록버튼을 눌러보면

  • 테이블에 객체가 잘 등록된 것을 확인 가능하다.
profile
하마드

0개의 댓글