본문 바로가기

Back-End/토비의 스프링3

(21)
5-4장. 메일 서비스 추상화 메일 서비스 추상화고객으로부터 사용자 레벨 관리에 관한 새로운 요청사항이 들어온 경우라면?User에 email 추가upgradeLevel()에 메일 발송 기능 추가JavaMail이 포함된 코드의 테스트테스트 코드를 돌리면 SMTP host에 연결할 수 없다고 에러가 날 것이다. 그렇다면 아래 처럼 테스트 서버를 구축하는건 어떨까? UserService ---> JavaMail ---> 메일 서버 ---> 테스트용 메일 서버 매번 메일이 발송되는건 바람직하지 못하다. 메일 발송은 부하가 큰 작업일 뿐 아니라, JavaMail은 검증된 라이브러리이다. 따라서 JavaMail API를 통해 요청이 들어간다는 보장만 있다면 굳이 테스트할 때마다 JavaMail을 구동시킬 필요가 없다. UserService --..
5-3장. 서비스 추상화와 단일 책임 원칙 서비스 추상화스프링의 트랜잭션 서비스 추상화 기법을 이용해 다양한 트랜잭션 기술을 일관된 방식으로 제어할 수 있게 됐다. 수직, 수평 계층 구조와 의존관계추상화 기법을 통해 특정 기술환경에 종속되지 않는 코드르 만들었다. UserDao나 UserService는 각각 담당하는 코드의 기능적인 관심에 따라 분리되었다. 같은 애플리케이션 로직을 담은 코드지만 내용에 따라 분리했다. 같은 계층에서 수평적인 분리라고 할 수 잇다. 트랜잭션 추상화는 이와 좀 다르다. 애플리케이션 코드와 그 하위에서 동작하는 로우레벨의 트랜잭션 기술이라는 다른 계층의 특성을 갖는 코드를 분리한 것이다. UserService : 사용자 관리에 대한 비즈니스 로직UserDao : 데이터를 어떻게 가져오고 등록할 것인가에 대한 데이터 엑..
5-2장. 스프링 - 트랜잭션 서비스 추상화 사용자 레벨 업그레이드 코드를 완성했다. 하지만, 레벨 업그레이드 작업 중 에러가 발생하여 일부 유저만 수정되었다면 어떻게 처리해야할까? 고객들의 불만을 일으키지 않기 위해, 원상태로 돌려놓아야 한다. 즉, upgradeLevels()를 하나의 작업단위인 트랜잭션을 적용해야 한다. JDBC 트랜잭션의 트랜잭션 경계설정setAutoCommit(false)로 트랜잭션의 시작을 선언하고 commit() 또는 rollback()으로 트랜잭션을 종료하는 작업을 트랜잭션 경계설정이라 한다.Connection c = dataSource.getConnection(); c.setAutoCommit(false); // 트랜잭션 시작 try { // 트랜잭션 하나의 작업 PreparedStatement st1 = c.pre..
5장. 스프링 - 서비스 추상화(사용자 레벨 관리 기능 추가) 서비스 추상화예제를 살펴보면서 스프링이 어떻게 성격이 비슷한 여러 기술을 추상화하고 이를 일관된 방법으로 사용할 수 있도록 해주는지 살펴보자. ( 서비스 추상화 ) 예제 : 사용자의 활동내역을 참고해서 사용자 레벨 관리 기능 추가1. Level Enum 사용하기Level enum 만들기장점 1 : int 타입으로 레벨 상수를 사용하는 것보다 의미 있는 상수로 사용할 수 있음 ( int형 setLevel(10000)과 같은 버그 코드는 컴파일 에러가 나지 않음 ) 장점 2 : varchar 타입보다 DB 용량을 많이 차지하지 않는다. public enum Level { BASIC(1), SILVER(2), GOLD(3); private final int value; Level(int value) { thi..
1.3-IoC 컨테이너 : 프로토타입과 스코프 IoC 컨테이너 : 프로토타입과 스코프스프링의 빈은 기본적으로 싱글톤으로 만들어진다. 요청이 있을때마다 매번 애플리케이션 로직을 담은 오브젝트를 새로 만드는 것은 비효율적이기 때문이다. 한 빈 오브젝트에 여러 개의 스레드가 동시에 접근하기 때문에 상태 값을 인스턴스 변수에 저장해두고 사용할 수 없다. DB나 로직에 의해 새로 만들어지는 DTO 등은 파라미터나 리턴 값으로 전달하면 싱글톤으로 사용하는데 아무 문제가 없다. 먼저 스코프에 따라 어떻게 되는지 테스트 코드를 살펴보자. @RunWith(SpringRunner.class) @SpringBootTest public class ScopeTests { @Test public void singletonScope() { ApplicationContext a..
1.2-IoC 컨테이너 : 빈 설정하기 1.2-IoC 컨테이너 : 빈 설정하기스프링에서 IoC 컨테이너의 가장 기본적인 역할은 코드를 대신해서 애플리케이션을 구성하는 오브젝트를 생성하고 관리하는 것이다.( 이전 내용은 http://happyer16.tistory.com/183?category=692836 을 참고 ) 그렇다면 IoC 컨테이너가 자신이 만들 오브젝트가 무엇인지 어떻게 알 수 있을까?빈을 만들기 위한 설정 메타정보가 담긴 BeanDefinition을 IoC 컨테이너가 활용한다.빈 생성을 위한 메타정보가 무엇이 있는지?메타 정보를 표현하는 다양한 방법이 2가지에 대해 살펴보자. IoC 컨테이너 : 빈 설정 메타정보스프링에서는 오브젝트를 IoC 컨테이너가 생성하고 관리하는 과정에서 필요한 세밀한 방법을 제공한다. 하지만, 우리는 클래..
1.1-IoC 컨테이너 : 빈 팩토리와 애플리케이션 컨텍스트 IoC 컨테이너 : 빈 팩토리와 애플리케이션 컨텍스트스프링의 핵심 개념 중 하나인 IoC 컨테이너와 DI 기술에 대해 살펴보자. 스프링 애플리케이션에서는 객체의 생성, 사용, 제거, 관계설정 등을 애플리케이션 코드 대신 독립된 컨테이너가 담당한다. 코드 대신 객체에 대한 제어권을 갖고 있다고 해서 IoC(제어의 역전)이라 부른다. IoC 컨테이너 = 빈 팩토리 또는 애플리케이션 컨텍스트빈 팩토리 : 객체의 생성과 객체 사이의 런타임 관계를 설정하는 DI 시점에서는 빈팩토리라 함애플리케이션 컨텍스트 : 앤터프라이즈 애플리케이션을 개발하는데 필요한 몇가지 기능이 추가된 것 public interface ApplicationContext extends EnvironmentCapable, ListableBean..
스프링 공부방법 스프링 공부방법스프링을 사용할 때 우리는 원리에 대한 이해보다 단순 예제를 보고 바로 구현에 들어갔을 것이다. 하지만 스프링의 가치를 제대로 느끼며 사용하려면 스프링을 제대로 공부해야 한다. 그렇다면 제대로 공부하는게 무엇일까? 1. 스프링을 왜 사용하고 어떠한 원리인지 이해하기스프링이 주는 3가지 핵심 기술에 대한 이해와 스프링이 강조하는 프로그래밍 모델에 대한 이해가 우선이 되어야 한다. 2. 스프링 기술에 대한 지식과 선택 기준 정립스프링의 기본원리를 확실하게 이해하고 나면 스프링이 이를 어떻게 다양한 방법으로 확장하고 적용했는지 살펴보아야 한다. 스프링은 매우 폭넓은 접근 방법을 제공하기에 개발자가 어떤 것을 선택할지 정해야 한다. 3. 스프링의 적용과 확장스프링은 특정 아키텍처에 제한되는 프레임..
#6. AOP 6단원 공부하기 전에 AOP는 스프링을 공부하면서 IoC/DI, 서비스 추상화와 함께 나오는 스프링 3대 기술 중의 하나다. 항상 뒤에 나오고 가장 어려운 내용이라 제대로 공부를 하지 못했다. AOP를 제대로 사용하려면 스프링이 도입한 이유와 장점이 무엇인지 이해해야 한다. AOP의 적용 대상은 선언적 트랜잭션 기능(???)이다. AOP를 통해서 5단원에서 공부했던 코드를 더욱 더 깔끔한 방식으로 바꿀수 있다고 하네..... 6.1 트랜잭션 코드의 분리 5단원에서 서비스 추상화 기법을 통해 트랜잭션 기술에 독립적으로 만들어줬지만, 아직 서비스 코드에 쓸데없이 긴 트랜잭션 코드가 보인다. 그렇다고 이를 제거하기에는 트랜잭션 경계가 비즈니스 로직의 전후에 설정돼야 하는 것이 분명하다. 1) 트랜잭션 경계 설..
#5. 서비스 추상화 요약 비즈니르 로직을 담은 UserService 클래스를 만들고, 트랜잭션을 적용하면서 스프링의 서비스 추상화에 대해 알아보았다. 비즈니스 로직을 담은 코드는 데이터 엑세스 코드와 깔끔하게 분리되는 것이 좋다. DAO 기술 변화에 서비스 코드가 영향을 받지 않도록 인터페이스와 DI를 잘 활용해서 결합도를 낮춰야 한다.먼저 프레임워크에 대해 생각해보면, MVC나 DB 등 특정 기술을 도와주는 역할로 알고 있다. 하지만 스프링은 JavaEE 전반을 도와주는 것이기 때문에 에플리케이션 프레임워크라고 불린다. 1. 비즈니로직과 데이터 엑세스 코드의 분리 비즈니르 로직을 담은 UserService 클래스를 만들고, 트랜잭션을 적용하면서 스프링의 서비스 추상화에 대해 알아보았다. 5.1.2 까지 작업을 통해 Use..