전체 글 277

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

✔️ 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 같은 구조가 필요하다면 더욱 복잡해진다.부가 기능 수정이 발생하면 적용한 모든 클래스를 수정해야한다. (끔찍하다..)  정리부가 기능을 적용할 때 아주 많은 반복이 필요부가 기능이 여러 곳에 퍼져서 ..

스프링 고급편 - @Aspect AOP

✔️ @Aspect 프록시스프링은 @Aspect 애노테이션으로 매우 편리하게 포인트 컷과 어드바이스로 구성되어있는 어드바이저 생성 기능 지원  참고@Aspect 는 관점 지향 프로그래밍(AOP)을 가능하게 하는 AspectJ 프로젝트에서 제공하는 애노테이션이다.   @Slf4j@Aspectpublic class LogTraceAspect { private final LogTrace logTrace; public LogTraceAspect(LogTrace logTrace) { this.logTrace = logTrace; } @Around("execution(* hello.proxy.app..*(..))") // 포인트 컷 public Object execute(Pr..

스프링 고급편 - 빈 후처리기

✔️ 빈 후처리기 - BeanPostProcessor스프링이 빈 저장소에 등록할 목적으로 생성한 객체를 빈 저장소에 등록하기 직전에조작이 가능하다.한 마디로 빈 생성후무언가 처리하는 용도이다.  이를 사용하면 컴포넌트 스캔 대상들도 프록시로 등록할 수 있게 된다.      BeanPostProcessor 인터페이스 - 스프링 제공public interface BeanPostProcessor { Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException Object postProcessAfterInitialization(Object bean, String beanName) throws Bean..

스프링 고급편 - 스프링이 지원하는 프록시 (프록시 팩토리)

✔️ 프록시 팩토리 스프링은 동적 프록시를 통합해서 편리하게 만들어주는 프록시 팩토리(ProxyFactory) 기능을 제공프록시 팩토리 하나로인터페이스의 경우 JDK 동적 프록시를,구체 클래스의경우CGLIB를 적용해준다.  그런데 동적 프록시는 InvocationHandler가 , CGLIB는 MethodInterceptor 로 부가기능을 적용하였는데 프록시팩토리를 사용해도따로 만들어야할까? 스프링은 이 문제를 해결하기 위해 부가기능을 적용할 때 Advice   라는 새로운 개념을 도입했다.프록시 팩토리를 사용하면 Advice를 호출하는 전용 InvocationHandler, MethodInterceptor 를 내부에서 사용한다.   Advice 만들기Advice는 프록시에 적용하는부가 기능 로직이며,I..