반응형

스터디 77

[토비의 스프링 3.1 Vol 2] 1장. 오브젝트와 의존관계 (~1.2.2)

1장.IoC 컨테이너와 DI 1.1 IoC 컨테이너 : 빈 팩토리와 애플리케이션 컨텍스트 스프링 애플리케이션에서는 오브젝트의 생성과 관계설정, 사용 제거 등의 작업을 애플리케이션 코드 대신 독립된 컨테이너가 담당한다. 이를 컨테이너가 코드 대신 오브젝트에 대한 제어권을 갖고 있다고 해서 IoC라고 부른다. 스프링에서는 IoC를 담당하는 빈 팩토리 또는 애플리케이션 컨텍스트라고 부른다. 빈 팩토리와 애플리케이션 컨텍스트는 각각 기능 대표하는 BeanFactory와 ApplicationContext라는 두 개의 인터페이스로 정의되어 있다. ApplicationContext는 BeanFactory 인터페이스를 상속받고 있다고 보면 된다. 실제 스프링 컨테이너 또는 IoC 컨테이너라고 말하는 것은 바로 이 Ap..

[토비의 스프링 3.1 Vol 1] 8장. 스프링이란 무엇인가?

8.1 스프링의 정의스프링에 대해 가장 잘 알려진 정의는 이렇다."자바 엔터프라이즈 개발을 편하게 해주는 오픈소스 경량급 애플리케이션 프레임워크"애플리케이션 프레임워크 일반적으로 프레임워크는 애플리케이션의 특정 계층에서 주로 동작하는 한 가지 기술 분야에 집중된다. 애플리케이션 프레임워크는 특정 계층이나 기술, 업무 분야에 국한되지 않고 애플리케이션의 전 영역을 포괄하는 범용적인 프레임워크를 말한다. 목표는 애플리케이션 개발의 전 과정을 빠르고 편리하며 효율적으로 진행하는 데 있다. 스프링이 애플리케이션 프레임워크라고 불리는 이유는 애플리케이션의 전 영역을 관통하는 일관된 프로그래밍 모델과 핵심 기술을 바탕으로 해서 각 분야의 특성에 맞는 필요를 채워주고 있어 애플리케이션을 빠르고 효과적으로 개발할 수 ..

[토비의 스프링 3.1 Vol 1] 7장. 스프링 핵심 기술의 응용 (~7.7)

7.6 스프링 3.1의 DI 자바 언어의 변화와 스프링 (1) 애노테이션의 메타정보 활용 자바는 소스코드가 컴파일된 후 클래스 파일에 저장됐다가, JVM에 의해 메모리로 로딩되어 실행된다. 그런데 자바 코드 일부를 리플렉션 API 이용해 어떻게 만들었는지 살펴보고 동작하는 기능이 많아진다.특히 자바5에서 등장한 애노테이션 이후로 급격히 확산되기 시작했다. 자바 클래스나 인터페이스, 필드, 메소드 등은 그 자체로 실행 가능하고 상속하거나 참조하거나 호출하는 방식 등으로 직접 이용할 수 있다. 반면 애노테이션은 기존 자바 프로그래밍 방식으로 활용할 수 없고 옵션에 따라 컴파일된 클래스에 존재하거나 애플리케이션이 동작할 때 메모리에 로딩되기도 하지만 자바 코드가 실행되는 데 직접 참여하지 못한다. 복잡한 리..

[토비의 스프링 3.1 Vol 1] 7장. 스프링 핵심 기술의 응용 (~7.5 DI를 이용해 다양한 구현 방법 적용하기)

7.3 서비스 추상화 적용 자바에는 JAXB 외에도 다양한 XML과 자바오브젝트를 매핑하는 기술이 있다. 해당 기술에 대해서도 손쉽게 변경이 가능해야 한다. XML파일을 다양한 소스에서 가져오게 만들어야 한다. 임의의 클래스패스나 파일 시스템 상의 절대위치 또는 http 프로토콜 통해 원격에서 가져오도록 확장해야 한다. 7.3.1 OXM 서비스 추상화XML과 자바오브젝트를 매핑해서 상호 변환해주는 기술을 OXM Object-XML Mapping 이라고 한다. 스프링이 제공하는 OXM 추상화 서비스 인터페이스에는 자바 오브젝트를 XML로 변환하는 Marshaller와 반대로 XML을 자바오브젝트로 변환하는 Unmarshaller가 있다. OXM 기술에 따라 Unmarshaller 인터페이스 구현한 다섯 ..

[토비의 스프링 3.1 Vol 1] 7장. 스프링 핵심 기술의 응용 (~7.2 인터페이스의 부니롸 자기참조 빈)

7.1 SQL과 DAO의 분리 SQL을 dao에서 분리하는 작업이 남았다. 7.1.1 XML 설정을 이용한 분리 개별 SQL 프로퍼티 방식 SQL은 문자열로 되어 있으니 설정파일에 프로퍼티 값으로 정의해서 DAO에 주입할 수 있다. SQL 맵 프로퍼티 방식 SQL을 하나의 컬렉션으로 담아주는 방법을 선택한다. 맵을 이용하면 키 값을 이용해 SQL문장을 가져올 수 있다. 일일이 프로퍼티로 등록하는 방법에 비해 작업량도 적고 코드도 간단하다. 대신 오타와 같은 실수가 있어도, 해당 메소드가 실행되기 전에는 오류를 확인하기 어렵다. 7.1.2 SQL 제공 서비스 SQL과 DI 설정정보가 섞여 있으면 관리하기에도 좋지 않다. 스프링의 설정파일로부터 생성된 오브젝트와 정보는 애플리케이션을 다시 시작하기 ..

[토비의 스프링 3.1 Vol 1] 6장. AOP (6.7 ~ 6.8)

6.7 애노테이션 트랜잭션 속성과 포인트컷 가끔은 클래스나 메소드에 따라 제각각 속성이 다른, 세밀하게 튜닝된 트랜잭션 속성을 적용해야 하는 경우도 있다. 이런 경우라면 메소드 이름 패턴을 이용해서 일괄적으로 트랜잭션 속성을 부여하는 방식은 적합하지 않다. 기본 속성과 다른 경우가 있을때마다 일일이 포인트컷과 어드바이스를 새로 추가해줘야 한다. 6.7.1 트랜잭션 애노테이션 @Transactional 타깃은 메소드, 클래스, 인터페이스에 사용할 수 있다. 이때 사용되는 포인트컷은 TransactionAttributeSourcePointcut이다. /* * Copyright 2002-2024 the original author or authors. * * Licensed under the Apache L..

[토비의 스프링 3.1 Vol 1] 6장. AOP (6.6 트랜잭션 속성) + spring boot @Transactional 옵션

6.6 트랜잭션 속성 6.6.1 트랜잭션 정의 DefaultTransactionDefinition이 구현하고 있는 TransactionDefinition 인터페이스는 트랜잭션 동작방식에 영향을 줄 수 있는 네 가지 속성을 정의하고 있다. 1) 트랜잭션 전파 트랜잭션 경계에서 이미 진행중인 트랜잭션이 있을때/없을때 어떻게 동작할지 결정하는 것 PROPAGATION_REQUIRED 가장 많이 사용되는 트랜잭션 전파 속성진행 중인 트랜잭션이 없으면 새로 시작하고, 이미 시작된 트랜잭션이 있으면 이에 참여한다. DefaultTransactionDefinition의 트랜잭션 전파 속성PROPAGATION_REQUIRES_NEW항상 새로운 트랜잭션을 시작한다. PROPAGATION_NOT_SUPPORTED 트랜잭션..

[토비의 스프링 3.1 Vol 1] 6장. AOP (6.5 스프링 AOP)

6.5 스프링 AOP 6.5.1 자동 프록시 생성 분리해낸 트랜잭션 코드는 투명한 부가기능 형태로 제공돼야 한다. 투명하다는 건 부가기능을 적용한 후에도 기존 설계와 코드에 영향을 주지 않아야 한다는 것이다. 투명한 부가기능을 적용하는 과정에서 발견했던 거의 대부분의 문제는 해결했다. 타깃 코드는 여전히 깔끔한 채로 남아 있고 부가기능은 한 번만 만들어 모든 타깃과 메소드에 재사용 가능하고 타깃의 적용 메소드를 선정하는 방식도 독립적으로 작성할 수 있도록 분리되어 있다. 프록시 팩토리 빈 방식의 접근 방법의 두 가지 문제중 부가기능이 타깃 오브젝트마다 새로 만들어지는 문제는 ProxyFactoryBean의 어드바이스 통해 해결했다. 남은 것은 부가기능의 적용이 필요한 타깃 오브젝트마다 거의 비슷한 내용의..

[토비의 스프링 3.1 Vol 1] 6장. AOP (6.4장 스프링의 프록시 팩토리 빈) + spring boot @Transactional

6.4 스프링의 프록시 팩토리 빈6.4.1 ProxyFactoryBean 스프링은 일관된 방법으로 프록시 만들 수 있게 도와주는 추상 레이어 제공 생성된 프록시는 스프링의 빈으로 등록돼야 한다. 스프링의 ProxyFactoryBean은 프록시를 생성해서 빈 오브젝트로 등록하게 해주는 팩토리 빈이다. 기존에 만들었던 TxProxyFactoryBean과 달리, ProxyFactoryBean은 순수하게 프록시를 생성하는 작업만을 담당하고 프록시 통해 제공해줄 부가기능은 별도의 빈에 둘 수 있다 .ProxyFactoryBean이 생성하는 프록시에서 사용할 부가기능은 MethodInterceptor인터페이스를 구현해서 만든다. 기존에 만들었던 TxProxyFactoryBean 스프링의 ProxyFactoryBe..

[토비의 스프링 3.1 Vol 1] 6장. AOP (~6.3)

6장 AOP 스프링에 적용된 가장 인기 있는 AOP의 적용 대상은 바로 선언적 트랜잭션 기능이다. 6.1 트랜잭션 코드의 분리 6.1.1 메소드 분리 비즈니스 로직 코드 사이에 두고 트랜잭션 시작과 종료를 담당하는 코드가 앞뒤에 위치하고 있다. 트랜잭션 경계설정의 코드와 비즈니스 로직 코드 간에 서로 주고받는 정보 없이 독립적인 코드다. 비즈니스 로직을 담당하는 코드를 메소드로 추출해서 독립시킨다. 6.1.2 DI를 이용한 클래스의 분리 여전히 트랜잭션을 담당하는 기술적인 코드가 UserService 안에 있다. 간단하게 트랜잭션 코드를 클래스 밖으로 뽑아내면 된다. DI의 기본 아이디어를 이용하면 된다. 실제 사용할 오브젝트의 클래스 정체는 감춘 채 인터페이스 통해 간접으로 접근하는 것이다. 그 ..

반응형