Projects/Personal project - 게시판 만들기 9

[게시판 프로젝트] 테이블 설계 및 엔티티 관계매핑에 대한 회고

이번 포스트는 제 개인 프로젝트인 게시판 만들기를 모든 코딩 작업을 마치고 난 후 회고 목적으로 작성하는 포스트입니다. 사실 해당 프로젝트를 완료했을 때, 기능 하나하나에 공들인 만큼 모든 기능들이 순조롭게 작동되어 스스로가 너무 뿌듯했다. 그러나 두달이 지난 현재, 다시 코드를 살펴보니... 엔티티 하나만 살펴봤는데도 답답함이 느껴진다. @Entity @NoArgsConstructor @Getter @Setter public class Member extends Auditable { public Member(Integer memberId) { this.memberId = Long.valueOf(memberId); } @Id @GeneratedValue(strategy = GenerationType.ID..

@ElementCollection 그리고 @Embedded와 비교

Embedded Type을 공부하던 중 @ElementCollection과 @Embedded가 비슷하면서도 다른점을 느껴 개인적으로나마 간략하게라도 정리를 해야겠다고 생각하여 블로그를 작성하게 되었다. 먼저 @ElementCollection에 대해 알아보자 (@Embedded의 사용법은 이전 포스트에 기재: https://mason-lee.tistory.com/157 ) @ElementCollection 이란? @ElementCollection은 JPA에서 사용되는 어노테이션으로 단순한 컬렉션(리스트, 맵, 셋 등)을 사용하여 단일 혹은 복합적인 값 타입(int, String 등)을 저장할 때 사용되는 연관관계 매핑의 한 종류이다. 만약 복합적인 값 타입을 저장할 때에는 @Embeddable을 사용하여 ..

@Embedd를 활용한 관계 매핑

문제 발단 개인 프로젝트로 만든 게시판의 처음 계획했던 모든 기능들을 성공적으로 완성한 뒤 회고 차원에서 테이블 설계를 좀더 간략화 시킬 수 있는 방법이 없을까 고민하던중 Embedded Type을 알게 되어 알아보게 되었다. Embedded Type이란? Embedded Type은 JPA에서 사용되는 개념으로 엔티티의 일부 속성을 별도의 테이블로 분리하지 않고 하나의 테이블에 내장하는 방식이다. 장점 코드의 재사용: 여러 엔티티에서 공통된 속성을 임베디드 타입으로 묶어 재사용할 수 있다. 객체지향적 설계: 여러 속성을 하나의 객체로 분리하여 더욱 객체지향적으로 설계할 수 있다. 데이터베이스 스키마 최적화: 중복 데이터 저장을 최소화하여 데이터베이스 스키마를 깔끔하게 유지할 수 있다. 복잡성 감소: 일부..

MockMVC - Multipart form data요청 테스트

아무생각 없이 테스트 코드를 작성하던 도중 Multipart form data 타입의 요청을 테스트 할 차례가 다가 왔다. 일단 Multipart form data 타입의 요청을 테스트하고 해당 테스트를 기반으로 RestDocs를 이용하여 API문서를 만들기 위해서는 두가지 기능을 구현할 방법을 알아야 했다. MockMvc에서 Multipart form data 타입의 요청을 보내는 방법 해당 요청을 테스트한 뒤 RestDocs를 이용하여 API 문서로 만드는 방법 해당 기능을 수행하기에 앞서 request body의 형식이다. "requestBody"라는 key로 json형식의 데이터와 "photoImgs"의 key로 이미지파일이 들어가야 한다. 1. MockMvc에서 Multipart form dat..

Mock test 단계에서 발생한 MockHttpServletResponse: body is empty

드디어 게시판 프로젝트의 마지막 단계만 남았다! 마지막으로 Mock test를 진행하면서 Rest docs를 이용해 API문서를 만드는 도중에 발생한 문제이다. 문제발생 앞서 post 요청에 대한 테스트 코드를 작성한 뒤 통과하고 patch 요청에 대한 코드를 작성한 이후 테스트가 실패하게되었다. 먼저 작성한 테스트 코드이다. @WebMvcTest(value = MemberController.class) @MockBean(JpaMetamodelMappingContext.class) @AutoConfigureRestDocs public class MemberControllerRestDocsTest implements MemberControllerTestHelper { ... ... @Test @WithMo..

파일 업로드를 위한 AWS S3 연결 도중 발생한 문제들과 해결방안

이번 포스트는 개인 프로젝트인 게시판 만들기에서 AWS S3와 연동 도중 발생한 작은 문제들에 관한 포스트이다. 1. API platform API 개발중 API platform으로 주로 Insomnia를 사용했었다. 작성한 컨트롤러에서는 @RequestPart 에너테이션을 이용하여 json 타입과 form data 형식의 데이터들을 각각 받아주게 해주었는데 문제는 요청으로 보낼 각각의 데이터들에 어떤 타입의 데이터들인지 명시해주어 보내야 하는데 Insomnia에는 데이터 타입을 각각 지정해주는 기능이 없었다... StackOverFlow에서 조차도 Postman으로 갈아타라는 답변밖에 얻을수 없었고, 결국 반강제적으로 사용이 익숙한 Insomnia를 버리고 Postman으로 갈아타버리게 되었다. 2. ..

JPQL문에서 Enum 사용하기

멤버 엔티티 @Entity @NoArgsConstructor @Getter @Setter public class Member extends Auditable { ... ... @Enumerated(value = EnumType.STRING) @Column(length = 20, nullable = false) private MemberStatus memberStatus = MemberStatus.MEMBER_ACTIVE; ... ... public enum MemberStatus{ MEMBER_ACTIVE("활동중"), MEMBER_SLEEP("활동 중지"), MEMBER_QUIT("활동 정지"); @Getter private String status; MemberStatus(String status) ..

UnexpectedTypeException과 DTO에서 Enum타입 사용

처음 시작은 게시판의 게시글을 post 하기 위한 DTO를 작성하고 요청을 보내 테스트하던중 UnexpectedTypeException 예외가 발생하였다. (해당 예외 이름에서 알 수 있듯이 요청으로 받은 JSON 파일이 다른 타입을 제공하고 있어서 발생한 예외이다. 이것만 좀더 일찍알았더라면 2시간을 허비하지 않았을텐데...) 발생한 예외의 DTO와 Enum 코드 DTO public class PostsDto { @Getter @Builder @Setter public static class Post{ ... ... @NotBlank private String title; @NotBlank // 예외 발생지점 private Posts.PostStatus postStatus; @NotBlank priva..

DB연동 도중 발견된 버그들(Enumerated, AuditingEntityListener, Optional 메서드)

회원에 관한 CRUD 서비스를 완성하고 회원을 등록했을때 발견된 버그이다. 위의 그림을 살펴보면 CREATED_AT, LAST_MODIFIED_AT, MEMBER_STATUS 컬럼이 비어있다. JPA에서는 참조 타입에 입력값이 없는경우 null로, int와 같이 정수형 원시타입의 경우 0으로 채워져 저장된다. 버그1 - MEMBER_STATUS에 열거형 데이터 적용 public class Member extends Auditable { ... ... @Enumerated @Column(length = 20, nullable = false) private MemberStatus memberStatus = MemberStatus.MEMBER_ACTIVE; ... ... public enum MemberSta..