[Spring] 외부설정과 프로필 1 외부 설정 - 커맨드 라인 옵션 인수와 스프링 부트 스프링 부트는 커맨드 라인을 포함해서 커맨드 라인 옵션 인수를 활용할 수 있는 ApplicationArguments를 스프링 빈으로 등록해둔다. 그리고 그 안에 입력한 커맨드 라인을 저장해둔다. 그래서 해당 빈을 주입 받으면 커맨드 라인으로 입력한 값을 어디서든 사용할 수 있다. CommandLineBean @Slf4j @RequiredArgsConstructor @Component public class CommandLineBean { private final ApplicationArguments arguments; @PostConstruct public void init() { log.info("source {}..
하나의 애플리케이션을 여러 다른 환경에서 사용해야 할 때가 있다. 대표적으로 개발이 잘 진행되고 있는지 내부에서 확인하는 용도의 개발 환경, 그리고 실제 고객에게 서비스하는 운영 환경이 있다. 개발 환경: 개발 서버, 개발 DB 사용 운영 환경: 운영 서버, 운영 DB 사용 문제는 각각의 환경에 따라서 서로 다른 설정값이 존재한다는 점이다. 예를 들어서 애플리케이션이 개발 DB에 접근하려면 dev.db.com이라는 url 정보가 필요한데, 운영 DB에 접근하려면 prod.db.com이라는 서로 다른 url을 사용해야 한다. 이 문제를 해결하기 위한 방법으로는 각 환경에 맞추어 실행 시점에 외부 설정값을 주입하는 방법이 있다. 배포 환경과 무관하게 하나의 빌드(여기서는 app.jar를 빌드) 결과물을 만든..
프로젝트를 처음 시작하면 어떤 라이브러리들을 사용할지 고민하고 선택해야 하는데, 여기에 버전까지 고민해야 한다. 더 심각한 문제는 각 라이브러리들끼리 호환이 잘 되는 버전도 있지만 잘 안되는 버전들도 있다는 점이다. 과거에는 이런 문제들 때문에 처음 프로젝트를 세팅하는데 상당히 많은 시간을 소비해야 했다. 스프링 부트는 라이브러리들을 편리하게 사용할 수 있는 다양한 기능들을 제공한다. 외부 라이브러리 버전 관리 스프링 부트 스타터 제공 라이브러리 직접 관리 스프링 부트가 편리한 라이브러리 관리 기능을 제공하기 전에는 직접 라이브러리를 하나하나 고르고 설정했었다. 웹 프로젝트를 하나 설정하기 위해서는 수 많은 라이브러리를 알아야 하고, 추가로 각각의 라이브러리의 버전까지 골라서 선택해야 한다. 여기서 눈에..
과거에는 톰캣 같은 WAS를 별도로 설치하고, IDE에 복잡한 설정을 거쳐 개발이 완료된 코드를 WAR로 만들고 이것을 또 WAS에 전달해서 배포하는 과정이 필요했다. 하지만 스프링 부트는 WAS가 라이브러리로 jar 내부에 포함되어 있기 때문에 복잡한 설정이 필요 없고, 배포는 JAR로 만들어서 원하는 위치에서 실행하기만 하면 된다. 간단한 프로젝트를 통해 스프링 부트가 어떻게 톰캣 서버를 내장해서 실행하는지 알아보자! build.gradle plugins { id 'java' id 'org.springframework.boot' version '3.0.2' id 'io.spring.dependency-management' version '..
외장 서버 VS 내장 서버 전통적인 방식(외장 서버) 과거에 자바로 웹 애플리케이션을 개발할 때는 먼저 서버에 톰캣 같은 WAS(웹 애플리케이션 서버)를 설치했다. WAS에서 동작하도록 서블릿 스펙에 맞추어 코드를 작성하고, WAR 형식으로 빌드해서 war 파일을 만든 뒤, war 파일을 WAS에 전달해서 배포하는 방식으로 전체 개발 주기가 동작했다. WAS 기반 위에서 개발하고 실행해야 하기 때문에 IDE 같은 개발 환경에서도 WAS와 연동해서 실행되도록 복잡한 추가 설정이 필요하다. 최근 방식(내장 서버) 최근에는 스프링 부트가 내장 톰캣을 포함하고 있다. 애플리케이션 코드 안에 톰캣 같은 WAS가 라이브러리로 내장되어 있다는 뜻이다. 개발자는 코드를 작성하고 JAR로 빌드한 다음에 해당 JAR를 원..
이번에는 REQUIRES_NEW를 사용해서 문제 상황을 가정하고 해결해보도록 하자. 문제 상황 회원가입에 성공하면 회원 DB와 회원 이력 로그 DB에 저장하는 비지니스 로직을 수행해야 한다. 회원가입과 이력 로그를 저장하는 로직을 하나의 트랜잭션으로 묶어서 처리하던 중, 만약 이력 로그 저장에서 문제가 발생하면 회원가입 자체가 안 되는 상황이 발생한다. 실제 비지니스에서 이런 상황이 발생하면 많은 회원들이 이탈하는 문제가 발생할 것이기 때문에 요구 사항이 변경 되었다. "회원 가입을 시도한 로그를 남기는데 실패하더라도 회원 가입은 유지되게 해주세요." 단순하게 생각해보면 LogRepository에서 예외가 발생하면 그것을 MemberService에서 예외를 잡아서 처리하면 될 것 같다. 이렇게 하면 Me..
REQUIRES_NEW는 외부 트랜잭션과 내부 트랜잭션을 완전히 분리해서 각각 별도의 물리 트랜잭션을 사용하는 방법이다. 그렇기 때문에 커밋과 롤백도 각각 별도로 이루어지게 된다. 이 방법은 각각 독립된 트랜잭션이기 때문에, 내부 트랜잭션에 문제가 발생해서 롤백 되더라도 기본 설정인 REQUIRED처럼 외부 트랜잭션에는 영향을 주지 않는다. 반대로 외부 트랜잭션에 문제가 발생해도 내부 트랜잭션에 영향을 주진 않는다. 아래 예제를 보면서 작동 원리를 이해해보자! Test Code @Test void inner_rollback_required_new() { log.info("외부 트랜잭션 시작"); TransactionStatus outer = txManager.getTransaction(new Defaul..
@Transactional을 적용하면 프록시 객체가 요청을 먼저 받아서 트랜잭션을 처리하고, 실제 객체를 호출해준다. 때문에 트랜잭션을 적용하려면 항상 프록시를 통해서 대상 객체(Target)을 호출해야 한다. 이렇게 해야 프록시에서 먼저 트랜잭션을 적용하고, 이후에 대상 객체를 호출하게 된다. 만약 프록시를 거치지 않고 대상 객체를 직접 호출하게 되면 AOP가 적용되지 않고, 트랜잭션도 적용되지 않는다. AOP를 적용하면 스프링은 대상 객체 대신에 프록시를 스프링 빈으로 등록한다. 따라서 스프링은 의존관계 주입시에 항상 실제 객체 대신에 프록시 객체를 주입한다. 프록시 객체가 주입되기 때문에 대상 객체를 직접 호출하는 문제는 일반적으로 발생하지 않지만, 대상 객체의 내부에서 자신의 다른 메서드 호출이 ..
프로젝트 리액터 프로젝트 리액터(Project Reactor)는 리액티브 스트림의 구현체 중 하나로 스프링의 에코시스템 범주에 포함된 프레임워크이다. 리액티브 스트림 사양을 구현하고 있기 때문에 리액티브 스트림에서 사용하는 용어와 규칙을 그대로 사용한다. 리액터를 사용하면 애플리케이션에 리액티브 프로그래밍을 적용할 수 있고, 비동기-논블로킹을 적용할 수 있다. 여기에 함수형 프로그래밍의 접근 방식을 사용해서 비동기-논블로킹 코드의 난해함을 어느정도 해결한다. Mono & Flux 리액터는 리액티브 스트림의 publisher 인터페이스를 구현하는 모노(Mono)와 플럭스(Flux)라는 두 가지 핵심 타입을 제공 모노(Mono)는 0..1개의 단일 요소 스트림을 통지하는 발행자이다. 플럭스(Flux)는 0...
웹 서버 (Web Server) HTTP 기반으로 동작하는 웹 서버는 보통 정적 리소스(HTML, CSS, JS, Image 등)를 제공한다. 예로 NGINX와 APACHE가 있다. 웹 어플리케이션 서버 (WAS) 웹 어플리케이션 서버(WAS) 역시 HTTP 기반으로 동작하며, 웹 서버의 기능도 포함하기 때문에 정적 리소스를 제공할 수 있다. 사용자의 요청이 들어오면 프로그램 코드를 실행해서 애플리케이션 로직을 수행한 후, 그 결과를 HTML이나 HTTP API(JSON)으로 제공한다. 예로 Tomcat, Jetty, Undertow가 있다. 웹 서버와 웹 어플리케이션의 차이 간단하게 살펴보면 웹 서버는 정적 리소스(파일)를 제공하고, WAS는 어플리케이션 로직까지 실행할 수 있다는 점이다. 하지만 웹 ..
- Total
- Today
- Yesterday
- 스프링부트
- 데이터베이스
- 노마드
- 스프링 부트
- 릿코드
- 정렬
- 그리디
- 문자열
- leetcode
- 자료구조
- webflux
- Spring
- 인프런
- 코틀린
- 구현
- 코테
- 백준
- 알고리즘
- 리팩토링
- 노마드코더
- spring boot
- kotlin
- 스프링
- mysql 8.0
- 북클럽
- 김영한
- Real MySQL
- 파이썬
- MySQL
- Algorithm
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |