본문 바로가기
DB Schema 설계 이번 Dailyclub에서 DB Schema 설계를 처음에 어떤 식으로 했는지, 그리고 개발이 진행되면서 어떤 식으로 변경했는지 정리하고자 한다. Version1 일단 사용자 요구사항과 화면 설계를 바탕으로 필요한 엔티티를 정했다. User Program Notice Bookmark Notification Message Location 여기서 ``User`/`와 ``Program`/`이 메인 엔티티가 된다. 그리고 기본적으로 모든 엔티티 테이블에 식별자인 ``id`/`컬럼과 ``created_date`/`, ``modified_date`/`컬럼을 넣었다. (``Location`/`테이블은 대한민국에 존재하는 지역을 테이블이라 어플리케이션이 켜질 때 초기값 세팅하고나면 운영 중에는 추가되거나 변경될 일이 .. 2022. 11. 3.
검색/필터링 기능 (Querydsl) 프로젝트 기획 단계에서부터 검색/필터링은 꼭 필요한 기능이었다. 메인 페이지를 보면 헤더에 검색어를 입력할 수 있고, 지역, 날짜, 친절도 등 다양한 조건을 입력해 모임을 필터링할 수 있는 기능이 있다. 다양한 조건들이 사용자로부터 입력됐을 때 이를 서버 쪽에서, 자세히 말하면 Data Access 계층인 Repository 계층에서 이 조건들을 가지고 모임을 조회하는 Query가 필요하다. 해당 Query는 단순한 Query가 아니라 조건값들의 존재여부에 따라서 동적으로 Query가 바뀌어야 하는 동적 Query를 작성해야 한다. 먼저, JPQL로 해당 조회 Query를 직접 작성해보자(일부분만) 첫 번째 조건 : 검색어 두 번째 조건 : 지역 .... String query = "select p fr.. 2022. 10. 2.
프로그램 상세 페이지에서의 API 스펙 고민 프로그램 상세 페이지에 필요한 정보는 크게 두 종류이다. 해당 프로그램에 대한 정보 + 해당 프로그램을 신청한 인원 리스트 처음 응답 API 스펙을 설계할 땐 ProgramDto.Response클래스에 List 필드를 추가해서 한 번에 넘기는 방식으로 했다. public class ProgramDto { @Schema(name = "프로그램 응답 API 스펙", title = "프로그램 응답 API 스펙") @Getter @Setter @NoArgsConstructor @AllArgsConstructor @Builder public static class Response { //program 정보 ... @Schema(title = "프로그램 이미지 리스트") private List applies; } .. 2022. 9. 22.
Entity와 DTO의 사용 범위는 어떻게 해야 할까? 현재 프로젝트에서는 API계층, Controller에서 DTO Entity 변환 작업을 하고 있다. 즉, Controller에서 Controller에 의존적인 Mapper를 이용해 RequestDto를 Entity로 변환하고, 이를 Service 계층으로 넘긴다. 그리고 작업 후 Repository로부터 넘어온 Entity를 Service 계층은 그대로 Controller로 넘기고 Entity를 ResponseDto로 변환한다. @Operation(summary = "프로그램 등록") @ApiResponses( @ApiResponse( responseCode = "201", description = "CREATED" ) ) @PostMapping(consumes = MediaType.MULTIPART_F.. 2022. 9. 22.
지역 정보를 Enum으로 할까 테이블로 할까? (@Converter) 프로그램 진행 장소에 대한 지역 정보를 어떤 식으로 저장할까 고민이 있었다. 별도의 테이블을 두어 foreign key로 연결 처음에는 프로그램 테이블과 별도로 지역 테이블을 두어 프로그램 테이블엔 지역 테이블 foreign key를 저장하는 형식으로 구성했다. 하지만 진행을 하려다 보니 여러 문제점이 예상됐다. 1) 프로그램 정보를 조회할 때마다 매번 지역 테이블을 Join하거나 따로 조회해야 한다. 2) 프로그램 테이블의 foreign key를 보고 어떤 지역인지 한 번에 알 수 없다. 3) 지역 테이블은 데이터가 변할 일이 거의 없을텐데 테이블로 둘 이유가 있을까? 그래서 별도의 테이블을 두기보다 프로그램 클래스 내부에 Enum으로 처리하기로 했다. 프로그램 클래스 안에 지역 Enum을 선언 pub.. 2022. 9. 19.
날짜/시간 정보 API로 주고 받기 이번 DailycluB 프로젝트에서는 프로그램 등록할 때 시작 날짜가 Request body에 담겨 있어야 하고, 그러면 Response body에 프로그램 시작 날짜와 프로그램 등록 날짜와 시간을 담아줘야 한다. 또한 프로그램 리스트 조회할 때 프로그램 시작 날짜가 검색/필터링 조건 중 하나라서 Query parameter로도 프로그램 시작 날짜 정보를 넘겨줘야 한다. 이를 어떻게 하면 편리하게 할 수 있을지 알아보자. 날짜 정보를 주고받을 때 매번 String LocalDate(LocalDateTime)으로 직접 바꿔줘야 하는 건가 싶었다. 찾아보니 jackson이 제공하는 @JsonFormat과 Spring이 제공하는 @DateTimeFormat을 적절하게 사용하면 이런 작업을 직접할 필요가 없다... 2022. 9. 18.
프로그램/유저 이미지 업로드 이미지를 프론트 쪽에서 보내는 방식은 다음과 같다. 1. Multipart/form-data 형식으로 모든 정보를 한 번에 보낸다. 2. 사진만 별도로 Mutlipart로 먼저 요청 보내서 서버에 사진 저장 후 응답받은 사진 정보를 JSON에 담아 다른 정보와 함께 보낸다. 3. Base64로 인코딩해서 JSON으로 한 번에 보낸다. 이미지를 저장하는 방식은 다음과 같다. 1. DB에 직접 저장 2. 서버 컴퓨터에 저장 후 DB에는 저장 경로를 저장 3. 프로젝트 서버와 별도의 서버에 저장 일단 사진이 주 컨텐츠였다면 3의 방식을 골랐겠지만, 사진이 많지 않을거라 생각했고 처음 구현해보는 기능이라 이미지 저장을 1번 방식으로 진행하기로 했다. 트래픽이 늘었을 때 DB에서 직접 사진을 저장하고 조회하는 방.. 2022. 9. 17.
Springdoc Swagger로 API 문서 작업하기 + 이슈 핸들링 저번 Pre-Project 때 API 문서 작업에 애를 먹었었다. 회고에도 적었지만 처음 배운 API 문서 툴이 Spring Rest Docs라서 Pre 때는 이를 이용했다. 굉장히 좋은 툴인 것은 맞다. 하지만 테스트 코드 작성이 익숙치 않아서 초반에 시간을 많이 잡아 먹었고, 또 API 스펙에 변화가 있을 때 즉각적으로 반영하기가 힘들었다. 그래서 후반에 가서는 API 문서가 제 기능을 하지 못했었다. 그래서 이번 프로젝트에서는 Swagger를 이용해서 API 문서 작업을 진행하기로 했다. Spring에서 Swagger 기능을 제공하는 라이브러리는 Springfox, Springdoc 이렇게 2가지가 있다. 그 중 Springdoc 라이브러리를 사용했다. API 문서 작업하면서 겪은 이슈를 정리하고자.. 2022. 9. 16.
[회고] Pre Project를 마치고 드디어 Main Project 들어가기 전에 진행한 Pre Project가 끝났다. 전반적으로 재밌게 진행했다. 프로젝트 초반에는 머릿속에 그림이 그려지지 않아서 헤매기도 하고 고민도 많았다. 하지만 점점 진행하면서 정리가 되어 팀원들과 같은 그림을 공유하면서 프로젝트를 진행할 수 있어서 프로젝트의 재미를 느낄 수 있었다. 완성하지 못하거나, 시도도 못해본 기능들이 여럿 있지만 메인 프로젝트 때 최대한 완성도 높은 프로젝트를 만들고 싶다. 팀원들보다 한 발자국만 먼저 가면서 프로젝트를 올바른 방향으로 이끌어 보고 싶다. 개인 회고 좋았던 부분 서버 환경 구성하면서 포트 포워딩, DMZ 설정을 경험할 수 있었고, 네트워크에 대한 전반적인 이해를 할 수 있었다. AWS 배포 환경을 처음부터 끝까지 설정하면서.. 2022. 9. 10.
포트포워딩 설정으로 테스트 서버를 만들다. AWS에 배포하기 전에 테스트 서버가 필요했다. 프론트 팀원들이 API를 테스트 해야했기 때문이다. 처음엔 어떻게 해야할지 몰랐는데 찾아보니 포트포워딩이나 DMZ 설정으로 내 로컬 컴퓨터를 서버 컴퓨터로 만들어서, 외부(프론트 쪽)에서 접근이 가능하게 할 수 있었다. 포트포워딩 - 외부에서 현재 내 컴퓨터로 접근이 가능하게 하는 설정 - 외부 IP의 특정 포트를 하나의 내부 IP의 특정 포트랑 mapping하는 설정이다. 이를 통해서 테스트 서버 뿐만 아니라, 프론트 팀원과 실시간으로 소통하면서 설정을 이리저리 바꿔가면서 같이 기능을 테스트할 때에도 유용했다. 이를 테면, 프론트 팀원과 쿠키/세션을 이용한 로그인 구현을 할 때가 있었다. 응답 헤더에 Set-Cookie 헤더는 잘 넘어갔지만 브라우저가 이.. 2022. 8. 31.