ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [무한댓글 게시판] 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;
    		
    	}
    	
      
    }
Designed by Tistory.