Back-end/Spring

[Spring / TIL] Spring profiles를 통해 application.yaml 하나로 개발환경 관리하기(부제. @Value 환경변수 사용법)

프로젝트를 개발하다 보면 하나의 서버 애플리케이션을 prod,dev,local 환경에서 각각 실행해야 할 일이 생깁니다. 예를 들면 Cloud SQL을 사용할 경우, private IP도 다를 것이고, 다양한 secret key 값도 환경에 따라서 모두 달라야 합니다. 이런 경우는 굉장히 흔한데 어떻게 효율적으로 관리할까요? 이번 시간에는 일반적인 스프링 부트 애플리케이션을 운영할 때, 하나의 application.yaml(application.properties) 파일 설정으로 Profiles를 관리하고, prod, dev, local 환경을 구성하고, 각 환경변수들을 어떻게 사용하는지에 대한 방법을 설명하려고 합니다. 0. @Value로 환경변수 사용하기 먼저 yaml파일의 프로퍼티 값을 전달받아서 ..

2023.01.17 게시됨

Back-end/Spring

[Spring/JPA] N+1 문제 및 N+1 해결 방법 과 즉시 로딩, 지연 로딩 이란?

이번 게시물에서는 오랜만에 Spring과 관련된 내용을 다뤄보려고 합니다. 바로 N+1 문제인데요. Spring을 사용하고, JPA를 사용하신다면 한번쯤은 들어봤던 문제일겁니다. N+1문제는 무엇일까요? 0. N+1 문제란? JPA에서 연관 관계가 설정된 엔티티를 조회할 경우에 조회된 데이터 갯수(N) 만큼 연관관계의 조회 쿼리가 추가로 발생하여 데이터를 읽어오는 현상을 말합니다. 직접 실습을 통해서 살펴보겠습니다. DB구조 및, Service, Controller, Dto 설계 DB 구조는 노래(Song)는 한개의 플레이리스트(Playlist)에만 속할 수 있고 테스트 데이터로는 3개의 플레이리스트에 노래 5개씩 총 15개의 노래를 추가했습니다. @Service public class SongServi..

2022.11.24 게시됨

Back-end/Spring

[Spring / TIL] @Transactional(readOnly=true) 가 꼭 필요한가?

Spring 학습을 위해 프로젝트를 진행하던 도중 조회한 값을 return 해주는 메소드에 당연하게 @Transactional(readOnly=true) 어노테이션을 사용했습니다. 막연하게 롤백(rollback) 때 사용하니까 @Transactional 어노테이션을 사용하긴 하지만, C, U, D 메소드가 아닌 읽어 오는 메소드는 @Transactional(readOnly=true)를 왜 사용하지? 아예 @Transactional 어노테이션을 안 붙이면 되지 않나?라는 궁금증이 들었고, 이번 기회에 확실하게 알아보려고 합니다. 트랜잭션(Transaction) 이란? 데이터베이스의 상태를 변경하고자 할 때, 한번에 수행되어야 하는 연산들을 의미합니다. Nest.js의 예를 먼저 들어보겠습니다. async ..

2022.02.19 게시됨