분류 전체보기
-
[PostgreSQL] 로컬 환경에서 PostgreSQL 서버를 실행하고 콘솔로 조작하기Today I Learned 2023. 6. 27. 00:24
로우 쿼리를 작성하는 과정에서 작성한 쿼리문의 쿼리 결과를 테이블을 통해 직접적으로 확인하면서 쿼리 로직의 유효성을 검증하거나, 실행 계획을 확인하는 등의 쿼리 명령어를 수행해야 하는 경우가 있을 수 있다. 이를 위해서는 특정 데이터베이스 서버에 CLI 환경이나 데이터베이스 관리 툴을 통해 직접 접속해야 한다. 백엔드 애플리케이션의 쿼리 로직을 수정하는 과정에서 쿼리문의 실행 결과를 테이블로 직접 확인하면서 결과를 확인하고 비교할 필요성이 생겼다. 이를 위해 로컬 환경에서 PostgreSQL 데이터베이스 서버를 생성해 실행시키고, 해당 서버에 PostgreSQL 데이터베이스 관리 툴인 Postico를 통해 접근해보기로 했다. 로컬 환경에서 PostgreSQL 서버 실행하기 * 해당 글의 내용은 macOS..
-
2023년 6월 4주차 주간 회고주간 회고 2023. 6. 26. 01:08
거의 다 밀었다! 이번 주에 포트폴리오 프로젝트 백엔드 애플리케이션에서 개선한 부분들은 다음과 같다. - QueryDSL을 도입해 일부 Service들의 복잡한 쿼리 로직 개선 - Event 기반 동작을 통해 하나의 기능에서 주요 기능과 부가 기능의 수행 책임 분리 블로그에 글이 하나 더 생기고, 문제를 더 좋은 방법으로 해결할 수 있는 스킬이 하나 더 늘어나고, 실제로 손길을 거치고 난 뒤 이전보다 말끔해지는 코드를 보는 보람이 있다. 앞으로 3개 Service의 쿼리를 개선하고, 클라이언트로부터 전달받은 채팅 메시지를 처리하는 기능에서 메시지 Entity 생성과 메시지 리소스 발행 로직을 분리하면 백엔드 애플리케이션 리팩터링이 1차적으로 마무리된다. 본래는 글을 쓰는 지금 쿼리문 작성까지 다 마치는 ..
-
[QueryDSL] WHERE 절에 서브쿼리 전달하기Today I Learned 2023. 6. 25. 01:11
검색 기능을 개선하는 과정에서 쿼리 로직의 테스트를 작성했지만, 뭔가 제대로 된 검증을 진행하지 않고 큰 틀만 검증하고 있는 것 같다는 생각이 들었다. 그래서 테스트에서 기존에 크게 고려하지 않았던 부분에 대한 테스트를 혹시나 해서 시도해보는 과정에서 이전에 발견하지 못했던 오류를 발견했고, 오류를 개선하면서 서브쿼리를 적용해본 과정을 정리하고자 한다. 새로 개선을 진행하고 있는 참가자 키워드 검색 결과 쿼리 로직을 살펴보도록 하자. 참가자 키워드 검색 결과 로직은 참가신청자 키워드 검색 결과 쿼리 로직과 거의 똑같은 형태를 갖는데, join하는 Register 테이블의 status Column 값을 APPLIED가 아닌 ACCEPTED로 전달한다는 한 부분에만 차이가 있고 나머지는 똑같다. 따라서 참가..
-
[Java] interface 상속, default method 개념을 적용해 여러 interface들 간의 공통 기본 동작 정의하기Today I Learned 2023. 6. 24. 01:45
서로 다른 interface들의 구현 객체들의 동작에서 중복이 나타난다면? QueryDSL을 적용해 다른 검색 동작을 개선하던 중 비슷한 로직의 중복이 나타났다. 지금까지 개선을 진행한 두 종류의 검색 기능들을 하나씩 보면서 발생한 중복을 살펴보도록 하자. 다음은 QueryDSL을 적용해 최초로 개선을 진행했던 참가신청자를 키워드로 검색하는 동작에서 필요한 Entity 그룹들을 List로 쿼리하는 메서드 시그니쳐를 정의한 GameSearchByApplicantRepository interface와, 해당 interface의 구현체의 구현 내용이다. // repositories/GameSearchByApplicantRepository.java public interface GameSearchByApplic..
-
[QueryDSL] Entity 쿼리 로직의 데이터베이스 접근 횟수를 최소화해 리소스 생성 동작 성능 개선하기Today I Learned 2023. 6. 23. 01:50
최종보스 프로젝트를 진행하면서 코드를 구현하는 데 가장 많은 시간을 써야 했고, 가장 마지막까지 방치했던 부분은 목록과 관련된 리소스를 반환하는 로직이었다. 하나의 리소스를 조합하는 데 여러 Entity들이 필요한 동작이 있었다. 경기 목록이나 검색 결과와 같은 리소스를 반환하는 식의 동작들이었는데, 본 글에서는 검색 결과 리소스를 구성하는 예시를 살펴보려 한다. 기존에는 경기 목록을 구성하는 리소스 하나를 생성하기 위해 다음의 Entity들이 필요했다. - Post 하나 - Place 하나 - Post, Place와 연결된 Game 하나 - Game과 연결된 Register 여러 개 경기에 참가하는 사용자를 키워드로 경기 목록을 검색하는 Service는 다음과 같은 로직으로 작성되어 있었다. 비록 Po..
-
[Spring] ApplicationEventPublisher를 활용해 Event 기반 동작 구현하기Today I Learned 2023. 6. 20. 12:36
이벤트(Event)란? 프로그래밍에서 이벤트란, 애플리케이션 내에서 발생시킬 수 있는 어떠한 사건을 의미한다. 애플리케이션에는 어떠한 이벤트를 발생시키는 주체와, 정해진 이벤트의 발생을 탐지해 동작을 처리하는 주체가 존재할 수 있다. 애플리케이션을 개발하는 과정에서 발생하는 문제들 중, 어떤 문제들을 이벤트 개념을 적용해 해결할 수 있을까? 특정 동작을 수행하는 과정에서 그 동작과는 개별적으로 추가적으로 수행해야 하는 외적인 동작이 존재할 경우, 그 외적인 동작을 처리하기 위한 이벤트를 발생시키고, 발생한 이벤트를 처리하는 로직에서 필요한 동작을 수행하게 할 수 있다. 경기를 생성했을 때, 경기 생성에 대한 알림을 같이 생성하는 경우를 생각해보자. 가장 간단하게 생각해볼 수 있는 구현 방식은 Game을 ..
-
2023년 6월 3주차 주간 회고주간 회고 2023. 6. 19. 01:35
고되다... 리팩터링 프로젝트 집중 재정비 기간을 5주로 잡고 작업을 진행하고 있다. 소스코드를 개선해 기존 애플리케이션의 동작이 그대로 동작하면서도 각 계층과 비즈니스 로직의 복잡성을 줄이는 리팩터링에 3주를, 기능을 추가해 애플리케이션을 완성하는 데 2주를 할당한 상태이다. 이번 주까지 백엔드 애플리케이션에서 Post 도메인, Game 도메인을 결합하고, 발견된 개선 필요점들을 개선하는 과정을 상당수 진행했다. 지금 할 수 있는 수준에서 계층 간의 작업들을 최대한 구분하고, 각 비즈니스 로직을 수행하는 필요한 동작을 가장 적합한 객체가 수행하도록 리팩터링하는 데 가장 많은 신경을 써서 작업을 진행했다. 백엔드 애플리케이션에서 남은 리팩터링 작업으로는 Application Layer의 근본적인 복잡성을..
-
[Java][JPA] 추상 클래스 개념을 적용해 알림 객체 설계 개선하기Today I Learned 2023. 6. 17. 18:36
로버트 C. 마틴이 언급한 객체지향 설계를 위한 5대 원칙 중 하나로 개방-폐쇄 원칙(Open-closed Principle)이 있다. '소프트웨어의 구성 요소는 확장에는 열려 있고, 변경에는 닫혀 있어야 한다'는 원칙으로, 간단히 이야기하자면 소프트웨어의 특정 모듈의 기능이 추가되어야 할 경우, 기존에 작성한 코드를 가급적 변경하지 않으면서 기능을 추가할 수 있어야 한다는 것이다. 기존 프로젝트의 알림 구조 프로젝트 애플리케이션에는 '알림'과 관련된 기능들과 Entity들이 존재했다. 특정 기능들을 수행했을 때 (이를테면 어떤 경기에 참가신청했다던가, 참가신청이 작성자에 의해 수락되었다던가와 같은 것들) 그와 관련된 정보를 담은 Notice 객체를 생성해 저장하는 부가적인 기능이었다. 본래 알림 기능을..