본문 바로가기
반응형

분류 전체보기350

@Value, @ConfigurationProperties, @Profile @Value @Value를 사용하면 외부 설정값을 편리하게 주입받을 수 있다. 물론 @Value도 내부에서 Environment를 사용한다. @Slf4j @Configuration public class MyDataSourceValueConfig { @Value("${my.datasource.url}") private String url; @Value("${my.datasource.username}") private String username; //... @Bean public MyDataSource myDataSource( @Value("${my.datasource.url}") String url, @Value("${my.datasource.username}") String username, @Val.. 2023. 3. 2.
외부설정과 프로필 외부 설정 개발 환경과 운영 환경에서 서로 다른 설정 값을 사용해야할 수 있다. 예를 들어 개발 환경과 운영 환경에 따른 데이터베이스 url, username, password 등이 있다. 이 문제를 해결하는 가장 단순한 방법은 각각의 환경에 애플리케이션을 빌드하는 것이다. 그럼 개발app.jar, 운영app.jar가 만들어진다. 해당 파일들을 각 환경별로 배포하면 된다. 하지만 이런 방법은 환경에 따라 빌드를 여러 번하고 개발 버전과 운영 버전의 빌드 결과물이 다르므로 좋은 방법이 아니다. 그러므로 보통 빌드는 한번만 하고 각 환경에 맞추어 실행 시점에 외부 설정 값을 주입한다. 이렇게 하면 빌드도 한번만 하면 되고, 개발 버전과 운영 버전의 빌드 결과물이 같기 때문에 개발환경에서 검증되면 운영 환경에.. 2023. 3. 2.
스프링 부트란 스프링 부트란 스프링 부트는 스프링을 기반으로 실무 환경에 사용 가능한 수준의 독립 실행형 애플리케이션을 복잡한 고민 없이 빠르게 작성할 수 있게 도와주는 여러 가지 도구의 모음이다. 스프링 부트의 목표 매우 빠르고 광범위한 영역의 스프링 개발 경험을 제공 강한 주장을 가지고 즉시 적용 가능한 기술 조합을 제공하면서, 필요에 따라 원하는 방식으로 손쉽게 변형 가능 프로젝트에서 필요로 하는 다양한 비기능적인 기술(내장형 서버, 보안, 메트릭, 상태 체크, 외부 설정 방식 등) 제공 코드 생성이나 XML 설정을 필요로 하지 않는다. 스프링 부트의 핵심 기능 컨테이너리스 개발: 별도의 웹 서버를 내장해서 웹 서버를 설치하지 않아도 됨. 라이브러리 관리: 손쉬운 빌드 구성을 위한 스타터 종속성 제공, 스프링과 .. 2023. 2. 28.
토비의 스프링 Vol.1 8장 스프링이란 무엇인가 8.1 스프링이란 무엇인가? 스프링에 대해 가장 잘 알려진 정의는 '자바 엔터프라이즈 개발을 편하게 해주는 오픈소스 경량급 애플리케이션 프레임워크'다. 이 문장을 풀어서 살펴보자. 애플리케이션 프레임워크 경량급 자바 엔터프라이즈 개발을 편하게 오픈소스 애플리케이션 프레임워크는 특정 계층이나, 기술, 업무 분야에 국한되지 않고 애플리케이션의 전 영역을 포괄하는 범용적인 프레임워크를 말한다. 애플리케이션 프레임워크는 애플리케이션 개발의 전 과정을 빠르고 편리하며 효율적으로 진행하는데 일차적인 목표를 두는 프레임워크다. 경량급 스프링이 가볍다는 건 기술수준이 가볍다거나, 스프링이 유치하고 용도가 제한적이라는 의미가 아니다. 불필요하게 무겁지 않고 가볍고 단순한 환경에서도 엔터프라이즈 개발의 고급 기술을 대부분.. 2023. 2. 21.
토비의 스프링 Vol.1 6장 트랜잭션 포스팅을 시작하겠습니다. 아래는 우리가 작성한 TransactionAdvice의 invoke 메서드 코드다. public Object invoke(MethodInvocation invocation) throws Throwable { TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition()); try{ Object ret = invocation.proceed(); transactionManager.commit(status); return ret; } catch(RuntimeException e){ transactionManager.rollback(status); throw e; } } 우리가 .. 2023. 2. 19.
토비의 스프링 Vol.1 6장 AOP 포스팅 시작하겠습니다. 6.1 트랜잭션 코드의 분리 지난 챕터에서 우리는 서비스 추상화를 이용해 UserService에서 특정 트랜잭션 기술에 종속적이지 않은 깔끔한 코드를 만들었다. 그러나 여전히 비즈니스 로직을 수행해야만 하는 UserService에 트랜잭션 기술 코드가 들어있다. 이를 해결하기 위해 데코레이터 패턴을 적용했다. UserService 인터페이스를 만들고 이를 구현한 비즈니스 로직을 수행하는 UserServiceImpl 클래스와 트랜잭션을 수행할 UserServiceTx 구현클래스를 작성했다. UserServiceTx가 UserServiceImpl을 인스턴스 변수로 받아 트랜잭션 경계 설정 코드를 진행하고 비즈니스 로직 관련 부분은 UserServiceImpl 메서드를 호출하면서 위임한.. 2023. 2. 18.
반응형