분류 전체보기 51

[JAVA] 객체 생성 전략 - 정적 팩토리 메서드 & 빌더 패턴

부트캠프를 다닐 때 이펙티브 자바 책을 받았다. 그 중 초기 부분에는 정적 팩토리 메서드와 빌더 패턴에 대해서 설명한다.(사실 부트캠프 초기에는 이펙티브 자바가 너무 어려웠어서 이해하지 못했다... 이제는 조금씩 읽히는게 그만큼 실력이 늘었나 뿌듯하다.) Car car = new Car(); 라는 단순한 생성자 사용을 지양하고 정적 팩토리 메서드나 빌터 패턴을 사용하는 데에는 불변 객체의 캡슐화 라는 의미가 가장 크다고 생각한다.   하지만 두 패턴 중 어떤게 더 나은 방법인지, 어떨때 써야하는지에 대한 개인적인 방향성은 항상 잡지 못했었다. 두 방식을 다시 공부해보며 개인적인 선택 기준을 정립하고자 이 글을 적게 되었다.  1. 정적 팩토리 메서드 (static factory method)정적 팩토리 ..

JAVA 2024.05.08

[Spring] Custom exception로 공통 예외 처리하기(feat. @ExceptionHandler, @ControllerAdvice)

토이 프로젝트에서 예외를 처리 하는 과정에서 custom exception을 구현했다.(가장 큰 이유는 실무 로직을 짜다보면 다양한 상황에 대해 예외가 발생할 수 있는데, 협업을 함에 있어 프론트단에 구체적인 예외를 알려주는게 좋다고 생각했다. 또한 예외처리를 한 곳에서 관리할 수 있다는 점에서 유지보수에 용이하다고 생각한다.) 스프링은 예외처리를 하기 위해 @ExceptionHandler라는 유연한 기능을 제공한다. 그리고 이러한 예외처리를 전역에서 제공하기 위해 @ControllerAdvice, @RestControllerAdvice를 사용할 수 있다. 이번 포스팅은 각 어노테이션이 어떠한 기능을 수행하며, 어떻게 예외처리를 깔끔하게 할 수 있는지 정리해보고자 한다.  1. Spring의 기본 예외처..

Spring 2024.05.07

[JPA] 동시성 이슈 해결 - 트랜잭션 격리 수준과 낙관적 락

더보기토이 프로젝트 게시글 참가를 하는 과정에서 동시성 이슈가 발생할 수 있다는 점을 깨달았다.인원 제한이 있을 경우, 예외를 발생시키고 참가를 할 수 없도록 로직을 작성하기는 했으나 만약 다수의 인원이 동시에 참가버튼을 누른다면 동시성 이슈가 발생할 수 있다고 생각했다. (이걸 왜 이제서야.... 그래도 알게되서 다행이다.)이를 해결하기 위해 방안을 찾아보던 중, 낙관적 락에 대해서 알게되었고 점차 리팩토링 해갈 예정이다. 그리고 공부하며 DB 내의 트랜잭션 격리 수준과 JPA 에서 지원하는 낙관적 락, 비관적 락에 대해서 알게되었는데 이를 한 번 정리해보고자 한다.  1. 트랜잭션이란?데이터베이스의 상태를 변화시키기 위해 수행하는 작업의 단위  즉, 데이터베이스 질의어를 통해 데이터를 변화시는 것을 ..

DB 2024.04.30

[Nginx] Nginx를 통한 무중단배포

토이 프로젝트를 진행하던 중 github Action, aws의 Codedeploy를 통해 CI/CD 과정에서 최신 버전을 배포할 때 서버가 꺼지는 현상이 있었다. 따라서 nginx를 통해 무중단배포를 구현했다. (단 두줄로 설명되지만 약 2주가 걸렸던 험난한...과정이었다.) 사실 Nginx를 선택한 이유는 무료여서 였다.......서버를 두 대 띄울 돈이 없었다...ec2도 프리티어를 사용한 마당에....🥹 하지만 토이 프로젝트를 복기하며 공부하니 Nginx를 통해 어떻게 무중단 배포를 구현할 수 있었는지 더 깊게 알게되었고, 이를 정리해보고자 한다. 1. Nginx란? Nginx란 트래픽이 많은 웹사이트의 서버(WAS)를 도와주는 비동기 이벤트 기반구조의 웹 서버 프로그램이다. 클라이언트로부터 정적..

Server 2024.04.24

[JPA] N+1 문제와 해결법

토이 프로젝트를 진행하던 중 무수히 많은 N+1 문제를 만날 위기에 봉착했다. (....) 주로 컬렉션 연관관계를 조회하던 중 이러한 참사가 일어날 뻔 했는데, 그 때마다 강의를 보고 공부했던 내용과 구글링(...)을 통해 해당 문제들을 해결할 수 있었다. JPA에서 발생할 수 있는 N+1 문제와, 이를 어떻게 적절하게 해결할 수 있을지 정리하기 위해 글을 적고자 한다. 1. N+1 문제란? JPA는 객체로 관계형 데이터베이스의 테이블 속 칼럼을 관리한다. 이 과정에서 객체는 서로 연관관계를 가질 수 있는데, 이 과정에서 N+1 문제가 발생한다. 개발자가 1 개의 쿼리를 날렸을 때, 해당 객체가 가지고 있는 연관관계의 객체들을 조회 하는 이유(N)로 추가적인 쿼리가 나가는 것을 N+1 문제라고 한다. 2..

DB 2024.04.24

[JPA] 다대다(N:M) 관계를 지양하는 이유와 해결법

토이 프로젝트를 진행하며 연관관계 매핑을 하던 중 다대다 관계를 만난 적이 있다. 게시글(Project)과 카테고리(Skill)가 바로 그 관계였다. 다대다 관계매핑은 최대한 지양하는 것이 좋다고 배웠기에 중간 테이블을 만들어 1:N 과 N:1 관계로 풀어주었다. 위와 같이 @ManyToMany를 사용하지 않은 이유를 복습하기 위해 글로 정리해보려 한다. 1. 다대다 관계 먼저, 프로젝트에서 정의한 도메인은 다음과 같다. Project : 개발 프로젝트 인원을 구하는 모집글 테이블 Skill : 카테고리 (개발 언어) 테이블 ERD는 아래와 같다. (관계형 데이터베이스에서는 다대다 관계가 없기 때문에 연결을 할 수 없어 이는 생략했다...) 위의 관계가 다대다 관계가 되는 이유는, 하나의 모집글은 여러 ..

DB 2024.04.20

[JWT] RefeshToken 관리로 Redis를 선택한 이유

토이 프로젝트를 진행하며 사용자를 인증하는 부분에서 JWT를 사용하였다. 사용자의 인증 정보는 Access Token에서 관리하였고, Access Token의 보안을 위해 Refresh Token을 도입하였다. 이 과정에서 Refresh Token을 관리하기 위해 Redis를 도입하였다. 전체 로직을 도입한 이유를 복습하기 위해 글로 정리해보려 한다. 1. JWT란 Json Web Token의 약어. 서버와 클라이언트 사이에서 통신할 때 권한을 확인하기 위해 사용하는 토큰이다. Token 인증 과정 1. 클라이언트가 서버에 접속할 경우(로그인), 서버가 해당 클라이언트에게 인증되었다는 의미로 토큰을 부여한다. 2. 토큰을 발급받은 클라이언트는 서버에 또 다른 요청을 보낼 때 요청 헤더에 토큰을 심어서 보..

DB 2024.04.19

스프링 배치(Spring Batch)로 대용량 데이터 관리하기

토이 프로젝트를 진행하며 대용량 데이터를 일괄적으로 관리하기 위해 Spring batch를 사용하였다. 복습 겸 구조를 이해하기 위해 글로 정리해보려하고 한다. 1. Spring Batch 란 Spring batch란 스프링에서 제공하는 대용량 데이터 처리를 위한 기능을 제공하는 프레임워크이다. 배치란 일괄처리를 의미한다. 즉, Spring batch는 지정한 스케줄러에 의해 정해진 시간에 맞춰 작업을 수행한다. 기능으로는 로깅/추적, 트랜잭션 관리, 작업 처리 통계, 작업 재시작, 건너뛰기, 리소스 관리 등이 있다. Spring Batch는 스케줄러인가? 결론적으로 Spring Batch는 스케줄러가 아니다. Batch는 데이터를 대용량으로 일괄처리하기 위한 Job이라는 형태의 객체를 제공할 뿐이고, ..

Spring 2024.04.01

Rest API VS. GraphQL

1. API란? Application Programming Interface의 약자로, 소프트웨어 응용 프로그램에서 다른 소프트웨어 구성 요소 또는 서비스와 상호 작용하기 위한 인터페이스를 제공하는 프로그래밍 기술 클라이언트와 서버 사이의 데이터 전송 통신을 위한 규칙이나 방법 2. GraphQL 2012년도 페이스북 개발자들이 개발한 REST를 대체하는 데이터 질의 쿼리 언어 2-1. REST API를 대체한 이유 주로 핸드폰 사용자가 많았던 페이스북에서는 앱의 복잡성이 늘어남에 따라서 REST API를 사용한 방식에 문제를 느꼈다. 그렇다면 REST API의 문제는 무엇이었을까? 끝없는 엔드포인트 서비스가 확장될수록 엔드포인트가 늘어남 만약 엔드포인트가 변경 되었을 경우, 프론트 및 백엔드 모두 수..

그 외 2024.03.27

CS 정리 - JAVA

2024.03.25 (추가 예정) Java의 특징 더보기 객체 지향 프로그래밍 언어 장점 JVM 위에서 동작하기 때문에 운영체제(OS)에 독립적이다 GC를 통해 자동으로 메모리 관리가 가능하다 단점 JVM 위에서 동작하기 때문에 실행 속도가 다른 언어에 비해 느리다 단일 상속만 가능하고, 문법이 엄격하다 Java의 실행방식 더보기 자바 컴파일러가 자바 소스코드(.java)를 읽어 자바 바이트코드(.class)로 변환 클래스 로더를 통해 클래스 파일들을 JVM으로 로딩 로딩된 클래스 파일들은 실행 엔진을 통해 해석 해석된 바이트 코드는 Runtime Data Area에 배치되어 실질적인 수행이 이루어진다 JVM (Java Virtual Machine) 더보기 자바 가상 머신의 줄임 용어 자바 애플리케이션을..

DNH 2024.03.25