Today I Learned
-
[원티드 인턴십] 231025Today I Learned 2023. 10. 25. 23:48
팀 프로젝트 시작! 원티드 프리온보딩 백엔드 인턴십 10월 과정에 지난 주 합격해 이번 주 월요일부터 과정을 진행하고 있다. 어제는 팀 빌딩이 진행되어 팀원분들과 4주 간 활동을 위한 규칙들을 정했고, 오늘은 오전 주어진 첫 팀 프로젝트 과제인 API 서버 구현 과제를 원활히 수행하기 위한 다음의 작업들을 진행했다. 요구사항 분석 및 명세 공통 API 및 ERD, 프로젝트 구조 설계 개발 환경 및 협업 도구 선정 이후 사전에 생성한 Spring Boot 스켈레톤 프로젝트를 기반으로 프로젝트를 생성했다. 작업에서 공통적으로 따를 따를 package 구조, 예외처리 로직을 정의한 뒤 원격 저장소에 반영했다. 배움의 장 작업을 진행하면서 가장 인상적이었던 부분은 팀 문서를 Notion에 작성하면서 각 영역들을..
-
[Java] String 덧셈 연산 대신 StringBuilder 또는 StringBuffer 객체를 활용해 성능 개선하기Today I Learned 2023. 10. 23. 23:04
StringBuilder Java 5에서 추가된 문자열 생성이나 연산, 수정을 효율적으로 처리하기 위해 도입된 클래스이다. 자세한 메서드 호출 방법은 StringBuilder.java 내 설명을 참조할 수 있다. String text = new StringBuilder() // StringBuilder 객체에 주어진 문자열을 추가한다. .append("hello") .append("World!") // StringBuilder 객체 내 문자열의 지정한 인덱스에 주어진 문자열을 추가한다. .insert(5, ", ") // StringBuilder 객체 내 문자열의 지정한 인덱스 범위만큼을 주어진 문자열로 대치한다. .replace(0, 1, "H") .replace(7, 12, "world") // St..
-
[OAuth] 소셜 로그인 구현: 2. 카카오 로그인 구현Today I Learned 2023. 8. 1. 21:51
본 글에서는 Spring Boot, React를 사용하는 백엔드/프론트엔드 애플리케이션에서 카카오 로그인을 구현하는 과정을 정리했다. 소셜 로그인을 구현하는 전체 과정은 다음의 순서에 걸쳐서 작성될 예정이다. OAuth 이해하기카카오 로그인 구현네이버 로그인 구현 카카오 소셜 로그인 플로우카카오에서 제공하는 소셜 로그인을 위한 플로우는 다음과 같다. 해당 플로우를 OAuth 프로토콜 플로우에 대입하여 살펴보았다. 로그인 방식으로는 사용자 서버 애플리케이션이 카카오 계정 소유자의 정보를 이용해 생성한 액세스 토큰을 사용자 클라이언트 애플리케이션에 반환하는 방식을 적용했다. 권한 부여1. 사용자 클라이언트 애플리케이션에서 카카오 계정 소유자의 개인정보 접근 권한을 획득하기 위해 카카오 계정 소유자를 카카오 ..
-
[OAuth] 소셜 로그인 구현: 1. OAuth 이해하기Today I Learned 2023. 7. 20. 16:37
본 글에서는 Spring Boot, React를 사용하는 백엔드/프론트엔드 애플리케이션에서 소셜 로그인을 구현하기 위해 OAuth 2.0 인증 프레임워크에 대해 이해한 내용을 정리했다. 소셜 로그인을 구현하는 전체 과정은 다음의 순서에 걸쳐서 작성될 예정이다. OAuth 이해하기 카카오 로그인 구현 네이버 로그인 구현 OAuth 2.0 OAuth는 특정 서버가 보유한 특정 사용자의 리소스에 대하여 타사 애플리케이션이 해당 리소스의 HTTP 서비스 액세스를 제한적으로 획득할 수 있도록 하는 인증 프레임워크이다. 용어 정의 OAuth에서 정의되는 주요 역할들은 다음과 같다. 리소스 소유자 (Resource Owner) 리소스 서버가 보유한 특정 리소스의 소유자이며, 해당 리소스에 대한 액세스 권한을 부여할 ..
-
[SQL][QueryDSL] LEFT JOIN, RIGHT JOIN의 차이점 비교하기 (Feat. 상속 관계의 Entity 쿼리하기)Today I Learned 2023. 6. 27. 15:50
채팅 기록 조회 백엔드 애플리케이션에서 특정 사용자가 자신이 참가하는 경기 게시글에 생성된 채팅방 페이지로 이동할 때, 해당 경기 식별자를 갖는 모든 채팅 내역을 조회하는 기능이 있었다. 해당 기능은 JPQL을 직접 작성해 Repository의 쿼리 메서드에 부여하는 방식으로 구현했었고, 이때까지는 사용자가 실제로 입력한 메시지와 특정 이벤트가 발생했을 때의 메시지를 구분해서 조합한 뒤 클라이언트에 DTO로 반환하고 있었다. 해당 기능을 위한 Entity인 ChattingMessage를 추상 클래스화하고, 채팅 메시지와 이벤트 메시지를 ChattingMessage를 상속받은 구체 클래스로 정의해 모든 메시지를 하나의 List에 담아 반환하도록 하는 것을 리팩터링의 목표로 두고 작업을 진행하던 중, LEF..
-
[PostgreSQL] 로컬 환경에서 PostgreSQL 서버를 실행하고 콘솔로 조작하기Today I Learned 2023. 6. 27. 00:24
로우 쿼리를 작성하는 과정에서 작성한 쿼리문의 쿼리 결과를 테이블을 통해 직접적으로 확인하면서 쿼리 로직의 유효성을 검증하거나, 실행 계획을 확인하는 등의 쿼리 명령어를 수행해야 하는 경우가 있을 수 있다. 이를 위해서는 특정 데이터베이스 서버에 CLI 환경이나 데이터베이스 관리 툴을 통해 직접 접속해야 한다. 백엔드 애플리케이션의 쿼리 로직을 수정하는 과정에서 쿼리문의 실행 결과를 테이블로 직접 확인하면서 결과를 확인하고 비교할 필요성이 생겼다. 이를 위해 로컬 환경에서 PostgreSQL 데이터베이스 서버를 생성해 실행시키고, 해당 서버에 PostgreSQL 데이터베이스 관리 툴인 Postico를 통해 접근해보기로 했다. 로컬 환경에서 PostgreSQL 서버 실행하기 * 해당 글의 내용은 macOS..
-
[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..