Back-End/Spring Advance & Boot 18

스프링 부트 - 외부 설정과 프로필2

✔️ 스프링이 지원하는 외부 설정스프링이 지원하는 다양한 외부 설정 조회 방법Environment@Value - 값 주입@ConfigurationProperties - 타입 안전한 설정 속성 @Slf4jpublic class MyDataSource { private String url; private String username; private String password; private int maxConnection; private Duration timeout; private List options; // 생성자 // @PostConstruct 로 멤버변수 log 출력 }  # application.propertiesmy.datasource.u..

스프링 부트 - 외부 설정과 프로필

✔️ 외부 설정하나의 애플리케이션을 여러 다른 환경에 적용개발 환경 : 개발 서버, 개발 DB 사용운영 환경 : 운영 서버, 운영 DB 사용 개발, 운영에 따라 환경 설정을 다르게 하여 빌드하는 것은 비효율적이다.  따라서 우선 빌드를 하고 배포 후 실행 시점에 외부 설정을 주입하는 것이다. 유지보수하기 좋은 애플리케이션 개발의 가장 기본적인 원칙변하는 것과 변하지 않은 것을 분리  외부 설정 사용 방법4가지 방법이 있다.OS 환경 변수 자바 시스템 속성 자바 커맨드 라인 인수외부 파일(설정 데이터) 1. OS 환경 변수System.getenv();전체  OS 환경 변수를 MAP으로 조회 가능 단, 다른 프로그램에서도 사용 가능 2. 자바 시스템 속성java -Durl=devdb -Dusername=de..

스프링 부트 - 자동 구성

✔️ 자동구성 요약datasource, jdbcTemplate등 이런 라이브러리에 있는 것들이 스프링 빈으로 자동 등록된다 . 그 이유는 스프링 부트의 자동 구성(Auto Configuration)이라는 기능을 제공하기 때문이다.먼저 자동 구성 없이라이브러리를 등록하고 사용해보자. 순수 라이브러리 사용순수 라이브러리를 사용하려면 jar파일을 project/libs 폴더에 넣는다build.gradle 에서 implementation files('libs/xx.jar') 로 추가한다.그리고 설정 클래스를 만들어서 직접 @Bean으로 수동 등록해줘야한다.   만약 많은 라이브러리를 손수 등록하려하면 정말 많은 시간을 사용해야할 것이다.스프링 부트의 자동 구성 기능을 쓰면 알아서 등록해준다. 한번 알아보자  자..

스프링 부트 - 부트와 내장 톰캣

✔️ WAR 배포 방식의 단점 웹 애플리케이션을 개발하고 배포하려면 다음과 같은 과정을 거친다.톰캣 같은 WAS 서버를 별도로 설치애플리케이션 코드를 WAR로 빌드빌드한 WAR 파일을 WAS에 배포이러한 방식에는 단점이 존재톰캣 같은 WAS를 별도 설치개발 환경 설정이 복잡단순 자바면 main() 메서드만 실행웹 애플리케이션은 WAS 실행하고 WAR와 연동하기 위한 복잡한 설정이 들어감배포 과정이 복잡 (WAR 빌드 후 WAS에 배포)톰캣 버전 변경시 재설치단순히 자바의 main() 메서드만 실행하면 웹 서버까지 같이 실행되도록하는 방법은 없을까?톰캣 같은 웹서버를 라이브러리로 내장해버리는 것이다.  (내장 톰캣 기능)  ✔️ 내장 톰캣build.gradle plugins { id 'java'}gr..

스프링 부트 - 웹 서버와 서블릿 컨테이너

✔️ 스프링 부트스프링 부트는 개발자가 스프링 초기 설정,라이브러리관리 등 복잡한 과정을 자동으로 처리해주어 쉽고 빠르게 스프링을 시작하게 해주는 것이다.  (내가 이해한 스프링 부트의 의미) 핵심 기능WAS (Web Application Server) : Tomcat 같은 웹 서버를 내장해서 별도의 웹 서버를 설치하지 않아도 됨  라이브러리 관리 : 손쉬운 빌드 구성을 위한 스타터 종속성 제공, 버전을 자동 관리 (외부 포함)자동 구성(Auto Configuration) : 프로젝트 시작에 필요한 스프링과 외부 라이브러리의 빈을 자동 등록외부 설정 : 환경에 따라 달라져야 하는 외부 설정 공통화프로덕션 준비 : 모니터링을 위한 메트릭, 상태 확인 기능 제공 참고스프링 프레임워크 ≠ 스프링 부트스프링 부..

스프링 고급편 - 실무 주의사항 (내부호출, 기술과 한계)

✔️ 프록시와 내부 호출프록시를 거치지 않고 target을 직접 호출하면 AOP가 적용되지 않고, 어드바이스도 호출되지 않는다. 예를 들어 이런 내부 호출이 있는 서비스에 AOP를 적용한다 하자.애스팩트는 해당 클래스의 모든 메서드에 대해서 log를 찍는 간단한 어드바이스를 가진다고 하자.public class CallService { public void A() { B(); // this.B(); } public void B() { }}CallService에 대한 프록시가 생성되고, target은 CallService가 될 것이다.참고B(); : 사실 this가 생략된 것이다. 프록시로 A() 호출 -> log 출력 -> B()호출 -> End 문제는 B()를 ..

스프링 고급편 - 실전예제

✔️ 예제 만들기유요한 스프링 AOP 만들기@Trace : 애노테이션으로 로그 출력@Retry : 애노테이션으로 예외 발생시 재시도 ExamRepository@Repositorypublic class ExamRepository { private static int seq = 0; /** * 5번에 1번 실패하는 요청 */ public String save(String itemId) { seq++; if (seq % 5 == 0) { throw new IllegalStateException("예외 발생"); } return "ok"; }} ExamService@Service@RequiredArgsC..

스프링 고급편 - 포인트컷

✔️ 포인트컷 지시자(Pointcut Designator) : PCD애스팩트J는 포인트 컷을 편리하게 표현하기위한 특별한 표현식을 제공@Pointcut("execution(* hello.aop.order..*(..))")execution : 메서드 실행 조인 포인트를 매칭within : 특정 타입 내의 조인 포인트를 매칭args : 인자가주어진 타입의 인스턴스인 조인 포인트  this : 스프링 빈 객체(스프링 AOP 프록시)를 대상으로 하는 조인 포인트 target : Target 객체(스프링 AOP 프록시가 가리키는 실제 대상)를 대상으로 하는 조인 포인트@target : 실행 객체의클래스에주어진 타입의 애노테이션이 있는 조인 포인트    @within : 주어진 애노테이션이있는 타입 내 조인 포인트..

스프링 고급편 - 스프링 AOP 구현

✔️ 구현@Slf4j@Aspectpublic class AspectV1 { @Around("execution(* hello.aop.order..*(..))") public Object doLog(ProceedingJoinPoint joinPoint) throws Throwable { log.info("[log] {}", joinPoint.getSignature()); return joinPoint.proceed(); }}AspectV1을 만든다. @Around : 포인트 컷 부분에 해당* 모든 타입, hello.aop.order 패키지와 그 하위 패키지(..)를 지정 // 자세한건 다음 포스트에서 설명@Around가 달린 메서드 doLog는 어드바이스가 된다.  ..

스프링 고급편 - 스프링 AOP 개념

✔️ AOP - 핵심 기능과 부가 기능핵심 기능해당 객체가 제공하는 고유의 기능 (주문 로직 같은 target의 기능)  부가 기능핵심 기능을 보조하기 위해 제공되는 기능 (로그 추적 로직, 트랜잭션)이러한 부가 기능은 단독으로 사용되지 않고, 핵심 기능과 함께 사용  보통 부가 기능은 여러 클래스에 걸쳐서 함께사용된다.  부가기능 적용 문제 그런데 여러 곳에부가 기능을 적용하기에는 각 클래스 마다 동일한 코드를 추가해야하기에 번거롭다. 부가 기능이 구조적으로 단순 호출이 아닌 try-cath-finally 같은 구조가 필요하다면 더욱 복잡해진다.부가 기능 수정이 발생하면 적용한 모든 클래스를 수정해야한다. (끔찍하다..)  정리부가 기능을 적용할 때 아주 많은 반복이 필요부가 기능이 여러 곳에 퍼져서 ..