국비학원 45~47일차 : Spring Boot_7, API 명세서_3

Digeut·2023년 5월 2일
0

국비학원

목록 보기
39/44

Board API

entity - BoardEntity

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity(name = "Board")
@Table(name = "Board") //어떤 db와 맵핑할지 지정
public class BoardEntity {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) //오토인클리먼트 설정
    private int boardNumber;
    private String writerEmail;
    private String title;
    private String content;
    private String boardImageUrl;
    private String writeDatetime;
    private int viewCount;

    public BoardEntity(PostBoardRequestDto dto){ //생성자 만들기

        Date now = new Date();
        SimpleDateFormat simpleDateFormat 
        			= new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        String writeDatetime = simpleDateFormat.format(now);

        this.writerEmail = dto.getBoardWriterEmail();
        this.title= dto.getBoardTitle();
        this.content = dto.getBoardContent();
        this.boardImageUrl = dto.getBoardImageUrl();
        this.writeDatetime = writeDatetime; //생성자가 돌아가는 시점으로 
        this.viewCount = 0; //만들어지면 초기값이 무조건 0
    }

entity - CommentEntity

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity(name = "Comment")
@Table(name = "Comment")
public class CommentEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int commentNumber;
    private String userEmail;
    private int boardNumber;
    private String commentContent;
    private String wirteDateTime;

}

entity - LikyEntity

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity(name="Liky")
@Table(name = "Liky")
@IdClass(LikyPk.class) //복합프라이머리 키 사용위해 만든 pk를 지정해준것
public class LikyEntity { //복합 프라이머리 키

    @Id
    private int boardNumber;
    @Id
    private String userEmail;

}

entity - primaryKey - LikyPk

@Data
public class LikyPk implements Serializable { 
//Entity로 쓰이기위해서 Serializable 사용
    
    @Column(name="board_number")
    private int boardNumber;

    @Column(name = "user_email")
    private String userEmail;
}

Serializable

Serializable은 자바에서 객체를 직렬화하고 역직렬화하기 위한 인터페이스입니다. 이 인터페이스를 구현한 객체는 바이트 스트림으로 변환될 수 있습니다.

따라서 자바에서 엔터티를 관리하는 경우 Serializable 인터페이스를 구현한 객체는 데이터베이스에 저장하거나 네트워크를 통해 전송할 수 있습니다. 이를 통해, 분산 시스템에서 엔터티를 공유하거나 클러스터링 환경에서 데이터를 공유할 수 있습니다.

또한, Serializable 인터페이스를 구현하는 것은 자바 직렬화(Serialization) 메커니즘에 따라 객체를 저장하고 복원할 수 있으므로, 엔터티를 파일로 저장하거나 불러올 때도 유용합니다. 따라서 엔터티 클래스에서 Serializable 인터페이스를 구현하는 것은 자바에서 객체를 저장하고 전송하는 데 필요한 기능을 제공하는 것입니다.

repository - LikyRepository

@Repository
public interface LikyRepository extends JpaRepository<LikyEntity, LikyPk>{ 
		//Liky는 복합 기본키를 가지고 둘다 타입이 다른 경우에 해당.
    //복합키의 경우 기본타입을 만들어줄수 없고 pk에 대한 타입을 만들어줘야한다! 
    //-> LikyPk 만들어서 지정해줌
    
    List<LikyEntity> findByBoardNumber(int boardNumber);

    @Transactional
    void deleteByBoardNumber(int boardNumber);

}

@Transactional

@Transactional 어노테이션은 스프링 프레임워크에서 제공하는 어노테이션 중 하나로, 트랜잭션 처리를 쉽게 할 수 있도록 도와줍니다.

트랜잭션(Transaction)이란, 데이터베이스에서 데이터를 읽거나 쓰는 작업의 논리적인 단위를 말합니다. 예를 들어, 한 거래에서 여러 개의 데이터를 동시에 처리할 때, 이러한 작업들을 하나의 트랜잭션으로 묶어서 처리합니다. 이때, 트랜잭션은 전부 성공하거나 전부 실패하는 것이 보장되어야 합니다. 만약, 중간에 문제가 발생하여 일부 작업만 처리되었다면, 롤백(Rollback)하여 모든 작업을 취소해야 합니다.

@Transactional 어노테이션은 메소드나 클래스에 적용할 수 있습니다. 메소드에 적용하는 경우, 해당 메소드가 실행될 때 트랜잭션이 시작되고, 메소드가 끝나면 트랜잭션이 종료됩니다. 이때, 메소드에서 예외가 발생하면 롤백됩니다. 클래스에 적용하는 경우, 해당 클래스의 모든 메소드에서 트랜잭션 처리가 적용됩니다.

@Transactional 어노테이션을 사용하면, 트랜잭션 처리를 직접 구현하지 않아도 됩니다. 스프링 프레임워크에서는 AOP(Aspect-Oriented Programming)를 사용하여, @Transactional 어노테이션을 적용한 메소드를 호출할 때 자동으로 트랜잭션 처리를 수행합니다. 이를 통해, 트랜잭션 처리 코드를 반복적으로 작성할 필요가 없어져서 개발 생산성을 높일 수 있습니다.

Board 수정과 작성에 대한 request필요하다
→ requestDto필요

dto - request - PostBoardRequestDto

@Data
@NoArgsConstructor
public class PostBoardRequestDto {

    @NotBlank
    @Email
    private String boardWriterEmail;
    @NotBlank
    private String boardTitle;
    @NotBlank
    private String boardContent;
    private String boardImageUrl;
}

dto - request - PatchBoardRequestDto

@Data
@NoArgsConstructor
public class PatchBoardRequestDto {

    @NotBlank
    @Email
    private String userEmail;
    @NonNull
    private Integer boardNumber; 
    //필수값, int는 기본형타입이라서 null을 받을수 없으므로 Integer로 입력
    @NotBlank
    private String boardTitle;
    @NotBlank
    private String boardContent;
    private String boardImageUrl;
}

Integer와 int의 null값 포함 여부

정수(integer) 형태와 int 형태는 모두 숫자 값을 저장하는 데이터 유형입니다. 하지만 null 값을 포함 여부는 다릅니다.

정수(integer) 형태는 null 값을 표현할 수 있습니다. null은 값이 없음을 나타내는 특별한 상태이며, 변수에 아직 값을 할당하지 않았거나 변수에 할당된 값이 없는 경우에 사용됩니다. 따라서 정수(integer) 형태의 변수는 null 값을 가질 수 있습니다.

반면에 int는 Java와 같은 몇몇 프로그래밍 언어에서 사용되는 데이터 형식이며, null 값을 허용하지 않습니다. int 형식의 변수는 항상 값을 가져야 하며, 값이 없는 경우에는 0과 같은 기본값으로 초기화됩니다. 때문에 int 형태의 변수는 null 값을 포함할 수 없습니다.

dto - response - GetBoardResponseDto

ResponseDta의 code, message는 계속해서 조회에서 진행되게 되는데 이 경우 ResponseDto를 extends해주면 된다. 반복적으로 작성하지 않아도 된다.

@Data
@NoArgsConstructor
@AllArgsConstructor
public class GetBoardResponseDto extends ResponseDto {
    
    private int boardNumber;
    private String boardTitle;
    private String boardContent;
    private String boardImageUrl;
    private String boardWriteDatetime;
    private int viewCount;
    private String boardWriterEmail;
    private String boardWirterNickname;
    private String boardWriterProfieImageUrl;
    private List<Comment> commentList;
    private List<Liky> likeList; 

    public GetBoardResponseDto(BoardEntity boardEntity, UserEntity userEntity,
         List<CommentEntity> commentEntities, List<LikyEntity> likyEntities 
            ){
                super("Su", "Success");
                this.boardNumber = boardEntity.getBoardNumber();
                this.boardTitle = boardEntity.getTitle();
                this.boardContent = boardEntity.getContent();
                this.boardImageUrl = boardEntity.getBoardImageUrl();
                this.boardWriteDatetime = boardEntity.getWriteDatetime();
                this.viewCount = boardEntity.getViewCount();
                this.boardWriterEmail = userEntity.getEmail();
                this.boardWirterNickname = userEntity.getNickname();
                this.boardWriterProfieImageUrl = userEntity.getProfileImageUrl();
                this.commentList = Comment.createList(commentEntities);
                this.likeList = Liky.createList(likyEntities);
            }
}

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
class Comment {
    private int commentNumber;
    private int boardNumber;
    private String commentWirterEmail;
    private String commentContent;
    private String commentWriterNickname;
    private String commentWirterProfileImageUrl;
    private String commentWriteDatetime;

    Comment(CommentEntity commentEntity){
        this.commentNumber = commentEntity.getCommentNumber();
        this.boardNumber = commentEntity.getBoardNumber();
        this.commentWirterEmail = commentEntity.getUserEmail();
        this.commentContent = commentEntity.getCommentContent();
        this.commentWriterNickname = commentEntity.getUserNickname();
        this.commentWirterProfileImageUrl = commentEntity.getUserProfileImageUrl();
        this.commentWriteDatetime = commentEntity.getWriteDatetime();
    }

    static List<Comment> createList(List<CommentEntity> commentEntities) { 
    	⭐//필요한 값들만 넣기 위해서 복사하는 행위
        List<Comment> commentlList = new ArrayList<>();
                for(CommentEntity commentEntity : commentEntities){
                    Comment comment = new Comment(commentEntity);
                    commentlList.add(comment);
                }
        return commentlList;
    }
}

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
class Liky {
    private int boardNumber;
    private String userEmail;
    private String userNickname;
    private String userProfileImageUrl;

    Liky(LikyEntity likyEntity){
        this.boardNumber = likyEntity.getBoardNumber();
        this.userEmail = likyEntity.getUserEmail();
        this.userNickname = likyEntity.getUserNickname();
        this.userProfileImageUrl = likyEntity.getUserProfileImageUrl();
    }
    
	//필요한 값들만 넣기 위해서 복사하는 행위
    static List<Liky> createList(List<LikyEntity> likyEntities){
        List<Liky> likeList = new ArrayList<>();
                for(LikyEntity likyEntity : likyEntities){
                    Liky liky = new Liky(likyEntity);
                    likeList.add(liky);
                }
                return likeList;
    }
}

dto - response - GetBoardListResponseDto

@Data
@NoArgsConstructor
//@AllArgsConstructor 생성자 만들어줄때 List 관련해서 값이 2개가 되므로 지운건가
public class GetBoardListResponseDto extends ResponseDto{
    private List<BoardSummary> boardList;

    public GetBoardListResponseDto(List<BoardListResultSet> resultSet){
        super("SU", "Success");

        List<BoardSummary> boardList = new ArrayList<>();
		
        //필요한 값들만 넣기 위해서 복사하는 행위
        for(BoardListResultSet result : resultSet){
            BoardSummary boardSummary = new BoardSummary(result);
            boardList.add(boardSummary);
        }

        this.boardList = boardList;
    }

}

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
class BoardSummary {
    private int boardNumber;
    private String boardTitle;
    private String boardContent;
    private String boardImageUrl;
    private String boardWriteDatetime;
    private int viewCount;
    private String boardWriterEmail;
    private String boardWirterNickname;
    private String boardWriterProfieImageUrl;
    private int CommenCount;
    private int likeCount; 

    public BoardSummary(BoardListResultSet resultSet){
        this.boardNumber = resultSet.getBoardNumber();
        this.boardTitle = resultSet.getBoardTitle();
        this.boardContent = resultSet.getBoardContent();
        this.boardImageUrl = resultSet.getBoardImageUrl();
        this.boardWriteDatetime = resultSet.getBoardWirteDateTime();
        this.viewCount = resultSet.getViewCount();
        this.boardWriterEmail = resultSet.getBoardWirterEmail();
        this.boardWirterNickname = resultSet.getBoardWirterNickname();
        this.boardWriterProfieImageUrl = resultSet.getBoardWriterProfileImageUrl();
        this.CommenCount = resultSet.getCommentCount();
        this.likeCount = resultSet.getLikeCount();
    }
}

controller - BoardController

@RestController
@RequestMapping("/api/v1/board")
public class BoardController {
    
    private BoardService boardService;

    @Autowired
    public BoardController(BoardService boardService){ 
    //생성자만들어서 DI한 것.
        this.boardService = boardService;
    }

    // 1. 게시물 작성
    @PostMapping("") //추가적인 path는 없음
    public ResponseEntity<ResponseDto> postBoard(
        @Valid @RequestBody PostBoardRequestDto requestBody //PostBoardRequestDto에 담은 내용 requestBody으로 body에 담게 연결
    ){
        ResponseEntity<ResponseDto> response = boardService.postBoard(requestBody);
        return response;
    }

    // 2. 특정 게시물 조회
    @GetMapping("/{boardNumber}")
    public ResponseEntity<? super GetBoardResponseDto> getBoard(
        @PathVariable("boardNumber") Integer boardNumber  
        				//Integer로 한 이유
    ){
        ResponseEntity<? super GetBoardResponseDto> response =
            boardService.getBoard(boardNumber);
        return response;
    }

    // 3. 게시물 목록 조회
    @GetMapping("/list")
    public ResponseEntity<? super GetBoardListResponseDto> getBoardList(){
        ResponseEntity<? super GetBoardListResponseDto> response =
            boardService.getBoardList();
        return response;
    }

    // 4. top3 게시물 목록조회
    @GetMapping("/top3")
    public ResponseEntity<? super GetBoardListResponseDto> getBoardTop3(){
        ResponseEntity<? super GetBoardListResponseDto> response =
            boardService.getBoardTop3();
        return response;
    }

    // 5. 특정 게시물 수정
    @PatchMapping("") //이거 경로있고 없고의 차이는 뭐지
    public ResponseEntity<ResponseDto> patchBoard( 
    //매개변수 받고 아니고의 차이 post랑 patch는 body에 정보 담음
        @Valid @RequestBody PatchBoardRequestDto requestBody
    ){
        ResponseEntity<ResponseDto> response = 
            boardService.patchBoard(requestBody);
        return response;
    }

    // 6. 특정 게시물 삭제
    @DeleteMapping("/{userEmail}/{boardNumber}")
    public ResponseEntity<ResponseDto> deleteBoard(
        @PathVariable("userEmail") String userEmail,
        @PathVariable("boardNumber") Integer boardNumber
    ){
        ResponseEntity<ResponseDto> response =
            boardService.deleteBoard(userEmail, boardNumber);
        return response;
    }
}

service - BoardService

public interface BoardService {

    public ResponseEntity<ResponseDto> postBoard(PostBoardRequestDto dto);
    public ResponseEntity<? super GetBoardResponseDto> getBoard(Integer boardNumber);
    public ResponseEntity<? super GetBoardListResponseDto> getBoardList();
    public ResponseEntity<? super GetBoardListResponseDto> getBoardTop3();
    public ResponseEntity<ResponseDto> patchBoard(PatchBoardRequestDto dto);
    public ResponseEntity<ResponseDto> deleteBoard(String userEmail, Integer boardNumber);
}


? super T : 해당 T의 클래스의 조상인 애들만 받도록 한것
반환하는 타입이 GetBoardResponseDto 같은 경우에는
정상이 아닌경우 반환되는 타입이 달라서 명시는 해당 클래스로 해두고
다른 명시는 그것보다 조상인것만 들어갈수 있도록 지정을 해둔것.

entity - BoardEntity

//생성자 만들기
public 🌷BoardEntity(PostBoardRequestDto dto){ 
        Date now = new Date();
        SimpleDateFormat simpleDateFormat = 
        	new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        String writeDatetime = simpleDateFormat.format(now);

        this.writerEmail = dto.getBoardWriterEmail();
        this.title= dto.getBoardTitle();
        this.content = dto.getBoardContent();
        this.boardImageUrl = dto.getBoardImageUrl();
        this.writeDateTime = writeDatetime; //생성자가 돌아가는 시점으로 
        this.viewCount = 0; //만들어지면 초기값이 무조건 0
    }


특정 게시물 조회 5번 시행하고 나서 조회수 변화

service - implement - BoardServiceImplement

@Service
public class BoardServiceImplement implements BoardService {

    private UserRepository userRepository;
    private BoardRepository boardRepository;
    private CommentRepository commentRepository;
    private LikyRepository likyRepository;

    @Autowired
    public BoardServiceImplement(UserRepository userRepository, 
        BoardRepository boardRepository, 
        CommentRepository commentRepository, 
        LikyRepository likyRepository){
        this.userRepository = userRepository;
        this.boardRepository = boardRepository;
        this.commentRepository = commentRepository;
        this.likyRepository = likyRepository;
    } //생성자 안만들고 위에 선언할때 Autowierd써서 사용해도 되지만
      //생성할때 생성할수가 없어서 이렇게 생성자 만들어서 사용중
      //권장사항이기도 하고 다른 외부 프레임워크에서도 이런 방식을 추천해서 사용한다.
      //아니면 선언때 final 걸어주고 Required하는거 public위에 
      //어노테이션 추가하면 생성자 만드는것과 같은 효과를 얻을수 있다.

    @Override
    public ResponseEntity<ResponseDto> postBoard(PostBoardRequestDto dto) {
       
        ResponseDto body = null;

        String boardWriterEmail = dto.getBoardWriterEmail(); 
        //이메일 가져오는것
        //유저 레포지토리에서 유저의 유무 검색해야한다.

        try{
            //존재하지 '않는' 유저 오류 반환
            boolean existedUserEmail = 
            userRepository.existsByEmail(boardWriterEmail);
            
if(!existedUserEmail){ //존재하지 않을때니까 !붙이기
                ResponseDto errorbody = 
                new ResponseDto("NU","Non-Existent User Email");
                return ResponseEntity.
                status(HttpStatus.UNAUTHORIZED).
                body(errorbody);
            }

            //검증끝났으니까 삽입작업하기

            BoardEntity boardEntity = new BoardEntity(🌷dto);
            boardRepository.save(boardEntity);

            body = new ResponseDto("SU","Success");

        } catch(Exception exception) {
            //데이터베이스 오류 반환
            exception.printStackTrace();
            ResponseDto errorBody = 
            new ResponseDto("DE", "Database Error");
            return ResponseEntity.
            status(HttpStatus.INTERNAL_SERVER_ERROR).
            body(errorBody);
        }
        //성공반환
        return ResponseEntity.status(HttpStatus.OK).body(body);
    }

    @Override
    public ResponseEntity<? super GetBoardResponseDto> getBoard(Integer boardNumber) {
        
        GetBoardResponseDto body = null;
        //ResponseDto errorBody = null;

        try{

            if (boardNumber == null) { 
            //board의 타입은 int, 
            //Repository의 타입은 Integer 
            //int는 null은 처리를 못해주므로 검증처리
                return CustomResponse.validationFaild();
            }

            //게시물 번호 조회
            BoardEntity boardEntity = 
            boardRepository.findByBoardNumber(boardNumber);
            if (boardEntity == null) { 
            //존재하지 않는 게시물 번호 조회시
                return CustomResponse.notExistBoardNumber();
            }
            //조회시 조회수 증가하는 기능 추가
            int viewCount = boardEntity.getViewCount();
            boardEntity.setViewCount(++viewCount);
            boardRepository.save(boardEntity);

            //User가져와서 boardWriter관련된 값 가져오기
            String boardWriterEmail = 
            boardEntity.getWriterEmail();
            UserEntity userEntity = userRepository.
            			findByEmail(boardWriterEmail);

            List<CommentEntity> commentEntities = commentRepository.
            			findByBoardNumber(boardNumber);
            List<LikyEntity> likyEntities = likyRepository.
            			findByBoardNumber(boardNumber);

            body = new GetBoardResponseDto(
            				boardEntity, 
                            userEntity, 
                            commentEntities, 
                            likyEntities); 

        } catch(Exception exception) {
            exception.printStackTrace();
            return CustomResponse.databaseError(); 
        }

        return ResponseEntity.status(HttpStatus.OK).body(body);
    }

    @Override
    public ResponseEntity<? super GetBoardListResponseDto> getBoardList() {
        GetBoardListResponseDto body = null;
        try {

            List<BoardListResultSet> resultSet = 
            		boardRepository.getList();
            System.out.println(resultSet.size());
            body = new GetBoardListResponseDto(resultSet);

        } catch (Exception exception) {
            exception.printStackTrace();
            return CustomResponse.databaseError();
        }
        return ResponseEntity.status(HttpStatus.OK).body(body);
    }

    @Override
    public ResponseEntity<? super GetBoardListResponseDto> getBoardTop3() {
        GetBoardListResponseDto body = null;
        try {

            List<BoardListResultSet> resultSet = 
            			boardRepository.getTop3List();
            body = new GetBoardListResponseDto(resultSet);
            
        } catch (Exception exception) {
            exception.printStackTrace();
            return CustomResponse.databaseError();
        }
        return ResponseEntity.status(HttpStatus.OK).body(body);
    }

    @Override
    public ResponseEntity<ResponseDto> patchBoard(PatchBoardRequestDto dto) {
        
        int boardNumber = dto.getBoardNumber();
        String userEmail = dto.getUserEmail(); //검증시 필요한 데이터들 가져옴
        String boardTitle = dto.getBoardTitle();
        String boardContent = dto.getBoardContent();
        String boardImageUrl = dto.getBoardImageUrl();

        try{
            // 존재하지 않는 게시물 번호 반환
            BoardEntity boardEntity = boardRepository.
            						  findByBoardNumber(boardNumber);
            if(boardEntity == null) 
            return CustomResponse.notExistBoardNumber();

            // 존재하지 않는 유저 이메일 반환
            boolean existedUserEmail = userRepository.
            						   existsByEmail(userEmail);
            if(!existedUserEmail) return CustomResponse.notExistUserEmail();

            // 권한없음 
            //가져온 이메일과 writeremail이 같은지 비교해주면된다
            boolean equalWriter = boardEntity.
            					  getWriterEmail().
            		 	    	  equals(userEmail);
            if(!equalWriter) return CustomResponse.noPermissions();

            boardEntity.setTitle(boardTitle);
            boardEntity.setContent(boardContent);
            boardEntity.setBoardImageUrl(boardImageUrl); 

            boardRepository.save(boardEntity);

        } catch(Exception exception){
            exception.printStackTrace();
            return CustomResponse.databaseError();
        }

        return CustomResponse.success();
    }

repository - BoardRepository

@Repository
public interface BoardRepository extends JpaRepository<BoardEntity, Integer> 
		{ 
    //Repository는 jpaRepository를 확장받고, 
    //제너릭 타입으로 엔터티와, 그 엔터티의 PK타입 적는다

    public BoardEntity findByBoardNumber(int boardNumber);
    
     @Query(
        value=
        "SELECT " +
        "B.board_number AS boardNumber," +
        "B.title AS boardTitle,"+
        "B.content AS boardContent,"+
        "B.board_image_url AS boardImageUrl," +
        "B.write_datetime AS boardWriteDateTime," +
        "B.view_count AS ViewCount," +
        "U.email AS boardWriterNickname," +
        "U.profile_image_url AS boardWriterProfileImageUrl,"+
        "count(distinct C.comment_number) AS commentCount,"+
        "count(distinct L.user_email) AS likeCount " +
        "FROM Board B, Comment C, Liky L, User U " +
        "WHERE B.board_number = C.board_number "+
        "AND B.board_number = L.board_number "+
        "AND B.writer_email = U.email "+
        "GROUP BY B.board_number "+
        "ORDER BY boardWriteDateTime DESC",
        nativeQuery = true
        )
    public List<BoardListResultSet> getList(); //제너릭 바꿔줌.

    @Query(
        value=
        "SELECT " +
        "B.board_number AS boardNumber," +
        "B.title AS boardTitle,"+
        "B.content AS boardContent,"+
        "B.board_image_url AS boardImageUrl," +
        "B.write_datetime AS boardWriteDateTime," +
        "B.view_count AS ViewCount," +
        "U.email AS boardWriterNickname," +
        "U.profile_image_url AS boardWriterProfileImageUrl,"+
        "count(distinct C.comment_number) AS commentCount,"+
        "count(distinct L.user_email) AS likeCount " +
        "FROM Board B, Comment C, Liky L, User U " +
        "WHERE B.board_number = C.board_number "+
        "AND B.board_number = L.board_number "+
        "AND B.writer_email = U.email "+
        "GROUP BY B.board_number "+
        "ORDER BY LikeCount DESC " +
        "LiMIT 3",
        nativeQuery = true
        )
    public List<BoardListResultSet> getTop3List();
}

@Query

@Query는 Java 또는 Kotlin으로 작성된 코드에서 SQL 쿼리를 지정하는 데 사용되는 애노테이션입니다.

repository - UserRepository

public interface UserRepository extends JpaRepository<UserEntity, String>{
                                                  /*해당 엔터티 PK의 타입*/

   public boolean existsByEmail(String email);
    public boolean existsByNickname(String nickname);
    public boolean existsByPhoneNumber(String phoneNumber);  
    
    public UserEntity findByEmail(String email);
}

repository - CommentRepository

@Repository
public interface CommentRepository extends JpaRepository
							<CommentEntity, Integer>{
    
    List<CommentEntity> findByBoardNumber(int boardNumber);
    @Transactional
    void deleteByBoardNumber(int boardNumber);
}

repository - LikyRepository

@Repository
public interface LikyRepository extends JpaRepository<LikyEntity, LikyPk>{
    
    List<LikyEntity> findByBoardNumber(int boardNumber);

    @Transactional
    void deleteByBoardNumber(int boardNumber);
}
profile
개발자가 될 거야!

0개의 댓글