-
[무한댓글 게시판] 2. Entity / Repository / Service + QueryDSL 사용Spring Boot 2024. 2. 15. 10:29
https://eocoring.tistory.com/14
[무한댓글 게시판] 1. 테이블 설계(+테이블 생성)
간단한 게시판 프로젝트 만들기 주요기능 무한 댓글 좋아요 조회수 무한 댓글 무한댓글(댓글, 대댓글) 찾은 정보를 토대로 비지니스 로직을 만들었다. 중요한 점은 댓글의 부모 필드, 또 부모필
eocoring.tistory.com
지난번에 초기 테이블 생성을 기준으로 Entity를 만들어주었다.
Entity 파일을 만들기 전에 Workbench를 통해서 MySQL에 board 테이블과 comments 테이블을 생성해주었다.
CREATE TABLE board ( board_id int primary key auto_increment, useremail VARCHAR(25), board_regdate VARCHAR(20) not null, board_title varchar(30) not null, board_content varchar(1000) not null, board_moddate VARCHAR(20), board_deldate VARCHAR(20), board_delyn char(1) default 'N' not null, board_likes int default 0 not null, board_views int default 0 not null ); CREATE TABLE Comments ( comment_id INT PRIMARY KEY AUTO_INCREMENT, board_id INT NOT NULL, useremail VARCHAR(25) NOT NULL, comment_root INT NOT NULL, comment_regdate VARCHAR(20) NOT NULL, comment_content VARCHAR(1000) NOT NULL, comment_deldate VARCHAR(20), comment_delyn CHAR(1) DEFAULT 'N' NOT NULL, comment_moddate VARCHAR(20), comment_steps INT NOT NULL );
Board Entity
package com.se.social.entity; import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.IdClass; import javax.persistence.Table; import javax.persistence.Transient; import org.hibernate.annotations.ColumnDefault; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Entity @Table(name = "board") @Data @AllArgsConstructor @NoArgsConstructor //@IdClass(OauthId.class) public class Board { @Id private String board_id; @Column(name = "useremail", nullable = false) private String useremail; @Column(name = "board_regdate", nullable = false) private String board_regdate; @Column(name = "board_title", nullable = false) private String board_title; @Column(name = "board_content", nullable = false) private String board_content; @Column(name = "board_moddate", nullable = true) private String board_moddate; @Column(name = "board_deldate", nullable = true) private String board_deldate; @Column(name = "board_delyn", nullable = false) @ColumnDefault("'N'") private char board_delyn; @Column(name = "board_likes", nullable = false) @ColumnDefault("0") private int board_likes; @Column(name = "board_views", nullable = false) @ColumnDefault("0") private int board_views; }
처음에 javax 라이브러리가 import가 되지 않아, 구글링을 해보니.
javax는 자바 9부터 지원을 해주는 라이브러리라 초기 설정되어있던, java 8 버전이 문제가 되었었다.
따라서 글쓴이는 dependency에서 java 버전을 11로 수정해주었고, javax를 사용할 수 있는 라이브러리를 가져올 수 있게 dependency를 추가해줬다.
<properties> <java.version>11</java.version> </properties>
<dependency> <groupId>javax.annotation</groupId> <artifactId>javax.annotation-api</artifactId> <version>1.3.2</version> <!-- 최신 버전 사용 가능한지 확인 --> </dependency>
그랬더니 javax 라이브러리 사용가능해졌다.
다시 돌아와서.
Comments Entity
package com.se.social.entity; import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.IdClass; import javax.persistence.Table; import javax.persistence.Transient; import org.hibernate.annotations.ColumnDefault; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Entity @Table(name = "comments") @Data @AllArgsConstructor @NoArgsConstructor //@IdClass(OauthId.class) public class Comments { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int comment_id; @Column(nullable = false) private int board_id; @Column(nullable = false) private String useremail; @Column(nullable = false) private int comment_root; @Column(nullable = false) private String comment_regdate; @Column(nullable = false) private String comment_content; private String comment_moddate; private String comment_deldate; @Column(nullable = false) @ColumnDefault("'N'") private String comment_delyn; @Column(nullable = false) private int comment_steps; }
이번에는 @ColumnDefault("'N'") 어노테이션을 넣어줌으로써 Default 값을 설정해주었다.
다음은 Service에서 호출해서 쓰일 Repository를 만들어보자.
BoardRepository
package com.se.social.repository; import org.springframework.data.jpa.repository.JpaRepository; import com.se.social.entity.Board; public interface BoardRepository extends JpaRepository<Board, Integer> { }
JPA란?
JpaRepository는 기본적인 CRUD(Create, Read, Update, Delete) 작업을 수행할 수 있는 메서드를 제공하는 인터페이스입니다.
여기서 Board는 엔터티 클래스를 나타냅니다. 엔터티 클래스는 데이터베이스 테이블과 매핑되는 객체를 나타내며, JPA를 사용하여 이 객체를 데이터베이스에 저장, 검색, 업데이트 및 삭제할 수 있습니다.
따라서 이 파일은 Board 엔터티에 대한 CRUD 작업을 수행하기 위한 Spring Data JPA Repository를 정의하는 것으로 볼 수 있습니다.
CommentsRepository
package com.se.social.repository; import org.springframework.data.jpa.repository.JpaRepository; import com.se.social.entity.Comments; public interface CommentsRepository extends JpaRepository<Comments, Integer> { }
다음은 Service 파트
BoardService
package com.se.social.service; import java.util.List; import java.util.Optional; import com.se.social.entity.Board; public interface BoardService { // selectList public List<Board> selectList(); // selectDetail public Board selectDetail(int board_id); // insert, update public String save(Board entity); // delete public int delete(int board_id); }
BoardServiceImpl
package com.se.social.service; import java.util.List; import java.util.Optional; import org.springframework.stereotype.Service; import com.querydsl.jpa.impl.JPAQueryFactory; import com.se.social.entity.Board; import com.se.social.repository.BoardRepository; import lombok.RequiredArgsConstructor; import lombok.extern.log4j.Log4j2; import static com.se.social.entity.QBoard.board;; @Log4j2 @Service @RequiredArgsConstructor public class BoardServiceImpl implements BoardService { private final BoardRepository repository; private final JPAQueryFactory queryFactory; // selectList @Override public List<Board> selectList() { return queryFactory .selectFrom(board) .where(board.board_delyn.eq('N')) .orderBy(board.board_id.desc()) .fetch(); } // selectDetail @Override public Board selectDetail(int board_id) { Optional<Board> result = repository.findById(board_id); if (result.isPresent()) return result.get(); else return null; } // insert, update @Override public String save(Board entity) { repository.save(entity); return entity.getBoard_id(); } // delete @Override public int delete(int board_id) { repository.deleteById(board_id); return board_id; } }
저번 팀프로젝트 JPQL을 사용해서 쿼리문을 작성했는데, 실무에서 많이 쓰인다고, 더 편리하다고 해서 사용해보고싶어서.
이번 프로젝트는 QueryDSL을 사용해보기로했다.
QueryDSL 사용법은 따로 블로그 회고를 작성예정이다.
CommentsService
package com.se.social.service; import java.util.List; import java.util.Optional; import com.se.social.entity.Comments; public interface CommentsService { // selectList public List<Comments> selectList(); // selectDetail public Comments selectDetail(int comment_id); // insert, update public int save(Comments entity); // delete public int delete(int comment_id); }
CommentsServiceImpl
package com.se.social.service; import java.util.List; import java.util.Optional; import org.springframework.stereotype.Service; import com.se.social.entity.Comments; import com.se.social.repository.BoardRepository; import com.se.social.repository.CommentsRepository; import lombok.RequiredArgsConstructor; import lombok.extern.log4j.Log4j2; @Log4j2 @Service @RequiredArgsConstructor public class CommentsServiceImpl implements CommentsService{ private final CommentsRepository repository; // selectList public List<Comments> selectList() { return repository.findAll(); } // selectDetail public Comments selectDetail(int comment_id) { Optional<Comments> result = repository.findById(comment_id); if (result.isPresent()) { return result.get(); } else { return null; } } // insert, update public int save(Comments entity) { repository.save(entity); return entity.getComment_id(); } // delete public int delete(int comment_id) { repository.deleteById(comment_id); return comment_id; } }
'Spring Boot' 카테고리의 다른 글
[무한댓글 게시판] 4. QueryDSL로 게시판 리스트 출력하기 (+페이지네이션) (0) 2024.02.16 [무한댓글 게시판] 3. Service 작성시 QueryDSL 사용하기 (1) 2024.02.15 [무한댓글 게시판] 1. 테이블 설계(+테이블 생성) (0) 2024.02.09 [Google Login] 구글 로그인 구현하기 (토큰 & 회원정보) (1) 2024.01.26 [Naver Login] 네이버 로그인 구현하기 (토큰 & 회원정보 담아오기 / 로그아웃) (1) 2024.01.24