본문 바로가기
5개월 간의 개발자 생활 후기 1월 1일(실질적으론 2일부터)에 첫 출근하고서 벌써 개발자로서 일한 지 5개월이 지났다. 정신없이 회사 생활하면서 여유가 없었는데 잠깐 여유를 내서 5개월 간의 생활을 간단하게 정리해보고자 한다. (사실 글을 쓰는 지금도 사실 여유가 있진 않다 ㅋㅋ 입사 5개월 차에 갑자기 맡은 업무가 많아지기도 했고, 내 개발 업무 속도가 아직은 막 빠르지 않기 때문에;;) 1. 기본은 탄탄할수록 업무 이해가 높아진다. 어찌보면 당연한 이야기지만 업무를 할수록 점점 더 뼈저리게 느끼고 있다. 비전공자로서 개발자로 직무를 전환할 때부터 들었던 말이다. 개발 문화가 탄탄한 회사일수록 면접에서 단순 skill보다는 CS와 같은 기본 지식을 까다롭게 물어보는 이유를 알게 되었다. 회사에서 팀원들이랑 점심시간에 개발 관련 이.. 2023. 5. 16.
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.
자주 쓰는 명령어 원격 저장소 브랜치 삭제 git push origin --delete {branch name} 원격 저장소 브랜치 업데이트 git fetch -p origin 로컬 브랜치 이름 변경 //변경하려는 브랜치로 이동 후 git branch -m {new branch name} 2022. 9. 23.
프로그램 상세 페이지에서의 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.