전체 글 165

spring boot 애플리케이션에서 null 데이터 처리하기

프로그래밍을 할 때 Null 데이터를 잘 처리하는 것은 매우 중요하다.  프레임워크 혹은 라이브러리를 활용해 Null 을 허용하지 않음으로써 null에 접근하는 오류를 사전에 방지할 수 있다. 다음 라이브러리에서 어노테이션 활용이 가능하다. Null 처리를 돕는 몇가지 라이브러리에 대해 정리해보려고 한다. Javax Validation (JSR-303/JSR-380) @NotNull null을 허용하지 않음Lombok (lombok.NonNull)@NonNullnull이 들어오면 NullPointerException 발생Spring (org.springframework.lang)@NonNullnull을 허용하지 않음 (Spring 전용) 1. Javax Validation (javax.validation..

개발/TIL 2025.02.22

단 한 줄로 spring boot 애플리케이션 성능 올리기 - gzip

GZIP (Content-Encoding: gzip)gzip은 웹에서 데이터 전송 시 사용되는 압축 방식으로, 응답 데이터를 압축해 전송함으로써 전송 속도를 높이고 대역폭을 절약한다.텍스트 데이터 혹은 json 과 같은 웹 응답 데이터를 압축하면 성능을 올리는데 도움이 된다. 주로 HTTP 응답에서 사용되며, Content-Encoding 헤더에 명시된다.  1.  요청 헤더 (클라이언트 → 서버)GET /index.html HTTP/1.1 Host: example.com Accept-Encoding: gzip, deflategzip: GZIP 압축을 지원함deflate: DEFLATE 압축을 지원함. 2. 응답 헤더 (서버 → 클라이언트)HTTP/1.1 200 OK Content-Encoding: gz..

개발/TIL 2025.02.21

Java의 Optional<T>로 안전하게 null 데이터 처리하기

Java의 Optional은 null을 직접 다루지 않고 안전하게 값(객체)을 다룰 수 있도록 감싸는 컨테이너이다. 기본적으로 null을 방지하는 방법은 javax validation, spring validation, lombok 등에서 제공하는 어노테이션을 활용하는 방법을 통해 null이 아니어야 하는 데이터를 사전 방어 하는 방식이 있다.  이번에 알아보는 방법은, 그런 경우는 다 막더라도 null일 수 있는 데이터에 대해 어떻게 처리할 것인가, 이다.  JAVA SE 8부터 등장한 Optional 은, null이거나 , null이 아닐 수 있는 데이터를 안전하게 감싸고 있는 클래스이며 다양한 api를 제공한다.1. Optional 을 사용하지 않고 get() 을 사용하는 경우. (비추천)- 값이 ..

개발/TIL 2025.02.20

default 를 이용해서 interface 에 메서드 정의하기

java 8부터는 default 키워드를 사용하면 인터페이스 내에서도 메서드의 구현을 포함할 수 있다. public interface ColorRepository { // 기존 방식 (쿼리 실행을 위한 선언) @Query(value = "SELECT ...", nativeQuery = true) Optional findByIdAndLangCd(@Param("id") Long id, @Param("language") String language); // default 메서드 사용하기 default Optional findById(Long id) { return findByIdAndLangCd(id, "en"); // 기본값 "en" 적용 }}default 키워드..

개발/TIL 2025.02.19

JpaRepository 에서 deleteAllInBatch 로 효율적인 삭제하기 (feat. vs deleteAll)

deleteAllInBatch() 함수란? org.springframework.data.jpa.repository.JpaRepository에서 정의되어 있다. 비교할 대상인 deleteAll()은 인터페이스 org.springframework.data.repository.CrudRepository에 정의 되어있다. 둘다 구현체인 org.springframework.data.jpa.repository.support.SimpleJpaRepository에 구현되어있다.  Spring Data JPA의 JpaRepository에서 제공하는 대량 삭제(Batch Delete) 메서드로, 모든 엔티티를 한 번의 SQL 쿼리로 즉시 삭제하는 기능을 한다. deleteAll 메서드는 조회후 삭제하는 반면 (SELECT..

개발/TIL 2025.02.18

SQL 엔진에서 JOIN 을 수행하는 원리 (MySQL)

SQL최적화를 수행하는 도중, 최적화를 수행한 쿼리의 내용은 다음과 같다.  table b를 table a에 left join 하는 과정에서 on 의 조건이 어차피 b의 PK 였던 경우. 예를 들면 이런 경우이다. select * frombleft join a on a.id = "1234" 이런식의 조인 쿼리는 서브쿼리로 조회하는 게 더 빠르지 않을까 싶어서 서브쿼리로 바꿨더니, explain analysis 분석결과는 sql 2배 가량 속도가 빨라졌다.그러나 막상 JPA 상에서 실행 결과를 확인할 때는 별로 시간 차이가 없었다.  (오히려 조금 더 느렸다.)이 과정에서 세운 여러 가설을 검증하다보니 SQL 엔진에서 join을 수행하는 원리에 대해서도 찾아보게 되었다. (이 문제를 해결한 내용은 추후 글..

개발/TIL 2025.02.17

CI/CD 방식과 각 장/단점

우선 간단히 적으면 다음과 같다. 배포 전략 무중단 배포  롤백 가능성 인프라 비용 적용 용도Blue-Green✅✅높음대규모 서비스, 빠른 롤백 필요Canary✅✅중간점진적 배포, 성능 테스트 필요Rolling✅❌낮음인프라 비용 절감, 지속적 배포Recreate❌✅낮음단순한 서비스, 빠른 배포 필요A/B Testing✅✅높음사용자 반응 기반 배포Feature Toggle✅✅낮음코드 배포와 기능 배포 분리 여기서는 3가지 업데이트 방식만 보려고 한다 .   1. 롤링 업데이트 방식특정 비율로 조금씩 점진적으로 업데이트하는 방식이다. (예: 인스턴스 하나씩 새로 배포되는 )다운 타임 제로라는 장점을 갖고 있다.구글도 작은 서비스를 배포할 때 이방식을 사용하고 있다. 문제점동시에 서비스의 여러 버전이 존재한다..

개발/TIL 2025.02.16

controller 에서 dto 그대로 전달하기 vs 파라미터로 나누어 전달하기

DTO 전달하는 방식서비스 확장성이 높음새로운 필드가 추가될 경우, Service의 메서드 시그니처를 변경하지 않고 DTO만 수정하면 된다. 의미 전달이 명확함DTO 자체가 하나의 도메인 개념을 가지므로, 어떤 요청인지 쉽게 이해 가능하다.서비스 인터페이스가 명확함createUser(UserRequestDto requestDto)처럼 도메인 중심적인 메서드 시그니처를 유지할 수 있다.하지만 반대로 동일한 함수를 다른 곳에서도 사용하고 싶을 때 dto 를 만들어서 전달하는 과정이 추가될 수도 있다.   파라미터를 전달하는 방식 DTO 와 독립적: dto가 변경되어도 service 레이어가 변경될 필요는 없다. dto 는 controller 의 요청을 표현하는 역할, service 레이어는 비즈니스 레이어를..

개발/TIL 2025.02.15

mongodb aggregation Spring Data MongoDB 에서 사용하기 (mappedResults - 클래스 매핑)

Spring Data MongoDBSpring Data JPA 와 다르다.  JPA 와 다르기 때문에 프로젝트 내에서 mongoDB가 아니라 RDB, 예를들어 Mysql을 위해서 Spring Data JPA 를 함께 사용할 경우 transaction 이 되는 방식 등등이 다르기 때문에 주의가 필요하다.  각설하고,  이 프레임워크를 이용해서 mongodb aggregation 수행 시 입력한 class 에 대해 mapping 된 결과를 mappedResults 필드에 저장하도록 할 수 있다.   이렇게 사용하면 mappedResult 에 알아서 클래스의 필드에 매핑이 되는 것이다. class TagCount { String tag; int n;}import static org.springframework..

개발/TIL 2025.02.14

개발 현업 7개월차의 회고

회사생활에 대한 회고와 개발 현업에 뛰어들게 된지 7개월차가 된 소감을 적어보려고 한다.  1. 녹록치 않은 회사 생활, 그러나 중요한 건 내가 어떻게 생각하고 무슨 일을 하느냐임을. 여느 회사생활이 그렇듯 녹록치 않을 거라고 생각은 했다. 우선 회사생활 이야기는 각설하도록 하고.. 이 회사에 와서 고쳐먹은 생각이 있다. 나는 내가 그냥 나름 공부하는 것도 즐기고, 일하는 것도 좋아하는 성격이라고 생각했었다.  그런데 그게 아니었다.  사람은 그렇게 단순한 존재가 아니었다.  나는 두루뭉실하게 '공부'하는 걸 즐거워하고 '일'하는 걸 좋아하는 사람이 아니었다.  내가 공부함으로써 미래에 기대되는 쓰임새가 있는 지식을 쌓는 것을 좋아하는 사람이었다. '일로써의 일' 같은 일이 아니라, 사소한 것이라도 실제..

끄적 2025.01.04
728x90
728x90