Backend/spring boot 8

spring boot : entity <-> dto 변환 방법에 대한 고민( MapStruct 에 대해)

개요프로젝트를 진행하며 여러 layer사이에 데이터를 전달할 때, dto, entity 간 변경이 자주 일어나는 상황에 변환하는 코드를 일일이 적어넣는 것이 불편했습니다.   예시로 보면, member  한 명을 생성하는 post api는 다음처럼 작성되어 있었습니다.  @Controller@RequiredArgsConstructorclass MemberController { private final MemberService memberService; @PostMapping() public Member createMember(@RequestBody MemberDto memberDto){ //dto 사용 Member member = memberService.createM..

Backend/spring boot 2024.10.09

spring boot jpa : soft delete 구현 (delete 후 데이터 복원)

데이터를 삭제할 때 DB에서 완전히 삭제되는 방식은 사실 프로젝트를 운영해 나갈 때 좋은 방식이 아니다. 누군가 데이터를 실수로 삭제했을 때 복구하려면 DB에 어떤 방식이든 데이터를 남겨둬야 했다. 그렇기에 데이터를 복구하는 방법을 찾아보니, soft delete라는 방식을 통해 데이터 삭제를 하는 방법이 있었다. soft delete란? 데이터를 삭제할 때 두 가지 방식 중 하나다. hard delete, soft delete가 있다. hard delete : 실제로 db에 delete쿼리를 날려 데이터를 삭제하는 것. soft delete : 실제로 삭제하는 것이 아니라, 테이블에 deleted_check 같은 필드를 추가해서 그 데이터가 삭제처리 되면 삭제가 아니라 deleted_check만 바꿔주..

Backend/spring boot 2023.09.06

spring boot jpa : hibernate delete 쿼리가 실행되지 않는 현상

프로젝트를 하면서, 게시글이나 유저 정보를 delete해야 하는 경우가 있었다. delete 자체는 jpa를 이용하면 간단하게 구현했었고 테스트도 항상 통과했었는데, 문제가 생겼다. 다음은 게시글 삭제를 위한 boardService의 deleteBoard 메서드이다. @Override @Transactional // @PreAuthorize("hasAuthority('ADMIN') or #board.author.username == authentication.principal.username") //hasAuthority를 사용해야 함.여기서 hasRole은 단지 문자열 비교로 public void deleteBoard(Long id, HttpServletRequest request) { //권한을 확인..

Backend/spring boot 2023.08.31

spring boot에서 DTO를 엔티티로 변환할 때 연관관계에 있는 엔티티와 연결하기

서비스 레이어로 request요청한 dto를 가져올 때 마주친 문제가 있었다. 예시로 가져온 이 클래스는 댓글관련 요청을 위한 RequestCommentDto이다. @Data @Builder @NoArgsConstructor @AllArgsConstructor @ToString public class RequestCommentDto { private Long user_id; private Long board_id; private String text; public Comment toEntity(){ return Comment.builder .text(text) //문제의 부분. .build(); } public RequestCommentDto(Comment comment){ this.user_id = c..

Backend/spring boot 2023.08.15

외부에서 spring boot 서버에 접속 해보기(접속 안 될 때 이슈, sk 브로드밴드 포트포워딩)

프로젝트를 진행하던 중, 프론트 팀원으로부터 한 번 열린 서버를 통해 테스트해보려 한다는 이야기를 듣고 외부에서 접속을 위한 준비를 했다. 포트포워딩을 하는 과정과, 그 과정에서 발생한 이슈들을 이야기 하려한다. 내 로컬 컴퓨터에서 실행되는 애플리케이션 서버에 접속하기 위해서는 당연히 내 컴퓨터의 주소를 알아야 할 것이고, 주소를 알고 pc로 찾아왔다면 그 다음에는 spring이 실행 중인 애플리케이션 포트 위치를 알아야 할 것이다. 먼저 아이피 확인을 위해 cmd창을 켜 ipconfig/all을 입력했다. ipv4 부분을 내 컴퓨터가 할당받은 내부 ip로, 이를 이용해 포트포워딩을 진행하려 한다. 우리집 공유기는 sk 브로드밴드를 사용하고 있다. 포트포워딩을 위해 기본 게이트 웨이 ip를 이용해 브라우..

Backend/spring boot 2023.08.11

spring boot 사이드 프로젝트 : service 테스트

이번에는 service 레이어를 테스트했던 방법을 작성해봤다. 1. Entity @Entity @Builder @Getter @Setter @NoArgsConstructor @AllArgsConstructor @Table(name = "board") //테이블과 매핑 public class Board extends BaseEntity { @Column(nullable = false) private String type; @Column(nullable = false) private String title; @Column(nullable = false) private String text; @Column(nullable = false) private String proceed_method; //진행 방식 @..

Backend/spring boot 2023.07.12

spring boot JPA : 컬렉션 형태의 데이터를 저장하기(@ElementCollection)

데이터베이스에 단일값이 아닌 컬렉션 형태(list 같은) 값을 넣는 것은 RDB에서 허용되지 않는다. 이 때문에 컬렉션 형태의 값이 필요하다면, 추가적인 테이블을 만든 뒤 그 테이블과 연관관계를 형성하는 방법을 사용해야 한다. 이 때 사용되는 방법이 @ElementCollection을 사용하는 것이다. @ElementCollection public class Post extends BaseEntity { @Column(nullable = false) private String type; @Column(nullable = false) private String title; @Column(nullable = false) private String text; @Column private String proce..

Backend/spring boot 2023.06.17

spring boot JPA : 페이징(paging)

보통 게시판 화면을 보면 게시글이 특정 개수 단위로만 띄워진다. 모든 게시글을 한눈에 보이도록 제공하지는 않는다. 그렇게 하면 서버 부하도 심할 것이고, 보는 사용자 입장에서도 가시성이 떨어질 것이다. 그래서 특정 단위로 쪼개서 데이터를 페이지 구분을 하는 방법을 사용하는데, 이것을 페이징이라고 이야기한다. DBMS를 이용해 쿼리를 할 때 개수를 나눠서 쿼리하는 페이지네이션 방법은 다 다르다. 예로 mysql은 offset, limit를 사용하면 가능하다. 문제는 이건 DBMS마다 다르기에, 페이지네이션을 하는 다양한 방법들을 하나의 방법으로 통합해서 추상화하여 제공하는 것을 필요로 한다. 이것을 JPA에서는 dialect(방언) 설정을 통해 처리한다. 이 덕에 개발자들은 SQL을 사용하지 않고 API를..

Backend/spring boot 2023.05.25