본문 바로가기

Spring

(17)
스프링 부트 웹 애플리케이션 만들기 with Spring Reactive Web 스프링 부트란 무엇인가 스프링 부트는 스프링 포트폴리오를 신속하게, 미리 정의된 방식으로, 이식성 있게, 실제 서비스 환경에 사용할 수 있도록 조립해 놓은 것이다. 신속성: 의존관계를 포함한 여러 요소에 대한 의사결정을 신속히 적용할 수 있도록 해준다. 미리 정의된 방식: 스프링 부트를 어떻게 사용할지 구성을 정하면 기본적인 설정값이 자동으로 지정된다. 이식성: JDK가 있는 곳이라면 스프링 부트 애플리케이션은 어디에서나 실행할 수 있다. 실제 서비스 환경에 사용 가능: 견고한 완성품이다. 리액티브 프로그래밍 소개 대규모 사용자가 지속적으로 증가하는 시스템(하이엔드 시스템)은 비동기적으로 인입되는 거의 무제한의 데이터 스트림을 논블로킹 방식으로 처리할 수 있어야 한다. 1970 년대에 리액티브 프로그래밍.. 더보기
스프링 영속성 관리 (영속성 컨텍스트) 이번 장에서는 스프링의 영속성 관리, 영속성 컨텍스트에 대해서 살펴본다. JPA에서 가장 중요한 2가지 요소를 꼽자면 하나는 ORM (객체와 관계형 데이터베이스 매핑)이고 나머지 하나는 영속성 컨텍스트이다. 아래의 그림과 같이 하나의 트랜잭션이 시작이 되면 각 트랜잭션마다 EntityManagerFactory에서 EntityManager를 생성하여 각자의 영속성 컨텍스트가 생성이된다. 영속성 컨텍스트란? 엔티티를 영구 저장하는 환경이라는 뜻 아래의 코드와 같이 엔티티 매니저를 통해서 영속성 컨텍스트에 접근할 수 있다. entityManager.persist(entity) 엔티티의 생명주기 비영속(new/transient) 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태 Member member = new.. 더보기
JDBC와 트랜잭션 문제, 스프링의 해결책 이번 포스팅에서는 스프링에서 트랜잭션을 적용하기 위해서 어떠한 과정을 거쳐왔는지를 예제를 통해 학습해보자. 예제는 간단하게 계좌이체를 하는 코드이다. @RequiredArgsConstructor public class MemberServiceV2 { private final DataSource dataSource; private final MemberRepositoryV2 memberRepository; public void accountTransfer(String fromId, String toId, int money) throws SQLException { Connection con = dataSource.getConnection(); try { con.setAutoCommit(false); bizL.. 더보기
스프링 AOP 내부호출 문제와 한계 이번 포스팅에서는 스프링 AOP 를 적용했을 때 발생할 수 있는 문제와 한계점에 대해서 설명하고 스프링은 이러한 문제를 어떻게 해결했는지를 살펴본다. 대표적인 두 가지 문제는 다음과같다. 내부호출이 일어났을 때 프록시가 적용되지 않는 상황 JDK 동적 프록시를 사용했을 때 타입캐스팅이나 의존관계 주입에서 오류가 발생할 수 있다. 이 두 가지 문제 상황을 살펴보자. 프록시와 내부호출 문제 먼저 아래의 코드를 살펴보자. public class CallServiceV0 { public void external(){ log.info("call external"); internal(); //내부 메서드 호출 } public void internal() { log.info("call internal"); } } @.. 더보기
스프링 AOP 스프링 AOP 개념 애플리케이션의 실행로직은 크게 핵심기능과 부가기능으로 나뉘어진다. 이 부가기능을 보통 횡단관심사(cross-cutting-concerns)으로 부른다. 예를 들어 주문이라는 기능을 구현하기 위해 orderService라는 클래스를 만들었을 때 주문 로직은 핵심기능이다. 여기에 로그나 트랜잭션 기능을 추가하는 것은 부가기능을 더하는 것이라 볼 수 있다. 이 부가기능을 적용하는 것이 간단한 문제일까? 이 질문에 대해 여러 상황을 생각해보자. 우리는 부가기능이라고 하는 기능을 여러 핵심기능에 적용할 수 있을 것이다. 100개의 핵심기능에 로그나 트랜잭션을 추가하려고 한다면 쉽게 생각하면 100개의 부가기능로직을 각각의 소스코드에 추가해주어야 한다. 부가기능이 변경되는 상황이 발생하면 어떻게.. 더보기
빈 후처리기, BeanPostProcessor 빈 후처리기 남아있는 문제 이전 포스팅에서 프록시 팩토리를 사용해서 스프링이 지원하는 프록시를 만들고 어드바이저로 부가기능을 생성해보았다. 스프링 빈에서 프록시 객체로 등록하기 위해서 해당 스프링 빈 대신에 프록시 객체를 넣고 프록시 객체 내부에서 부가기능과 함께 실제 객체를 호출하는 식으로 작성을 했다. 이렇게 할 때 문제는 복잡한 빈 등록 설정을 해줘야 한다는 것인데 빈 등록을 할 때 프록시 객체를 넘겨서 설정을 해주는 과정이 번거롭다. 게다가 빈을 컴포넌트 스캔으로 자동 등록할 때에는 이런식으로 수동으로 등록하기가 어렵다. 위와 같은 문제를 해결하기 위해 빈 후처리기를 사용한다. 빈 후처리기 (BeanPostProcessor) 객체를 스프링 빈 저장소에 등록하기 전에 조작을 할 수 있게 해주는 인터.. 더보기
스프링이 제공하는 프록시, 프록시 팩토리 spring 6. 스프링이 지원하는 프록시 프록시 팩토리 우리가 기존에 알아봤던 JDK 동적 프록시와 CGLIB을 사용한 프록시 구현(https://harrislee.tistory.com/95)은 각각 문제점이 있다. JDK 동적 프록시는 인터페이스가 있어야하고 CGLIB은 구체클래스가 있어야 구현이 가능하다. 인터페이스가 있을때는 JDK 동적 프록시를, 없을때는 CGLIB를 사용하도록 하려면 어떻게 해야할까? 또, 부가기능을 적용하기위해서 InvocationHandler, MethodInterceptor를 각각 만들었어야 했는데 이걸 공통으로 적용할 수는 없을까? 스프링에서는 동적프록시를 통합해주는 프록시 팩토리라는 기술을 제공한다. 프록시 팩토리가 알아서 인터페이스가 있을 때는 JDK 동적 프록시를,.. 더보기
Servlet ? Servlet 이란? 자바를 사용하여 웹페이지를 동적으로 생성하거나 데이터를 처리하는 서버측 프로그램 또는 기술(사양)을 의미한다. 서블릿이 없는 상황에서 아래와 같이 HTML Form 데이터를 서버로 전송하고 이를 처리하는 서버 프로그램을 만든다고 생각해보자. 이 때 서버에서 처리해야 하는 업무는 다음과 같이 매우 많다. 서블릿을 사용하지 않는다면 이러한 모든 처리를 직접 구현해야한다. 그러나 서블릿을 사용한다면 비즈니스 로직에만 집중 할 수 있다. @WebServlet(name = "helloServlet", urlPatterns = "/hello") public class HelloServlet extends HttpServlet { @Override protected void service(Htt.. 더보기