레이블이 spring인 게시물을 표시합니다. 모든 게시물 표시
레이블이 spring인 게시물을 표시합니다. 모든 게시물 표시

[Spring Junit] Transaction Rollback with Junit

[Spring Junit] Transaction Rollback with Junit
JUnit 테스트시에 DB설정은 다음과 같다.


  1. DataSource 설정
  2. Transaction 설정 
  3. Junit 테스트 수행. 

이때 DB에 입력 및 삭제 테스트를 진행하면 실제로 데이터가 DB로 입력되거나, 삭제가 발생한다.
이를 선택적으로 수행할 수 있는 방법은 다음과 같다.

@Log4j
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {
DBConfiguration.class
})
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
@Transactional
Bla... Bla... TestCodes.....

상기 코드에서 @TransactionConfiguration 부분의 프로퍼티 값으로 2가지 설정을 해준다.

  • transactionManager : 어느 트랜잭션매니저를 이용할 것인지 기술한다. 
  • defaultRollback : 기본 롤백 정책을 입력한다. (true : 롤백진행, false : 롤백없이 바로 CUD진행)
그리고 중요한 것은 @Transactional을 꼭 입력해야한다는 사실..
이 어노테이션은 해당 테스트가 트랜잭션 하에서 수행하게 할 것인지 지정해주는 것이니...
당. 연. 히 넣어주는 쎈스. 


[Spring] Interceptor and Filter

Interceptor And Filter in Spring


Spring에서 Interceptor와 Filter은 서로 같은 기능을 수행한다.

유사점 : 
1. filter와 Interceptor은 처리 방식에 있어서는 서로 동일하다.
2. 비즈니스 로직을 처리하기 전에 처리해야할 전처리를 수행하게 할수 있고.
3. 비즈니스 로직을 수행후에 해야할 후처리 작업을 수행할 수 있다.
4. 또한 지정된 request에 대해서만 filter나 interceptor가 동작하도록 제어할 수 있다.
5. 둘다 설정파일에 기술한 순서대로 실행이 된다.

차이점 : 
1. 호출시점 : 
  - Filter : Servlet이 수행되기 이전, 그리고 이후에 처리된다.
  - Interceptor : Dispatcher Servlet 호출 이후 Handler가 처리되기 이전, 그리고 이후에 실행된다.

  - 아래 그림을 확인해보면 명확하다.


2. 메소드 시그너처의 차이
2.1 Filter : 
  - init() : 필터 초기화
  - doFilter() : 전, 후처리용 메소드, 내부에서 filterChain.doFilter를 호출하여 해당 비즈니스처리를 계속해서 수행할 수 있다.
  - destory() : 필터 종료이후 실행.

2.2 Interceptor : 
  - preHandle() : 핸들러가 수행되기 전에 실행됨.
  - postHandle() : 핸들러가 수행되고 나서 실행됨.
  - afterCompletion() : View작업까지 완료되고 나서 실행됨.

3. 파라미터의 차이
- Filter는 ServletRequest, ServletResponse등을 받게 된다.
- Interceptor은 HttpServletRequest, HttpServletResponse, 그리고 대상핸들러 등을 받아서 처리할 수 있다.

# ServletRequest와 HttpServletRequest의 차이.
SERVLETREQUESTHTTPSERVLETREQUEST
javax.servlet패키지에 포함됨. javax.servlet.http 패키지에 포함됨. 
ServletRequest의 하위 인터페이스임
getParameter()와 같은 많은 메소드를 제공 ServletRequest의 다양한 메소드를 상속받음.
getQueryString()등과 같은 추가 메소드를 제공함
HTTP프로토콜의 헤더, 바디, 컨텐츠타입, 쿠키, 세션등  다양한 정보를 쉽게 사용할 수 있도록함. 
GenericServlet과 함께 사용됨. HttpServlet과 함께 사용됨. 
프로토콜에 독립적으로 사용가능 프로토콜에 독립적이나, HTTP프로토콜 에 특화되어 사용 
HTTP가 사용되지 않았을때 클라이언트에서 요청이 들어오면 web container는 servletRequest 객체를 생성하고 service()메소드로 전달하는 방식으로 운용되었다. 클라이언트에서 요청이 HTTP프로토콜을 이용하여 들어온경우 Web container는 HttpServletRequest 객체를 생성하고 service()메소드에 전달하여 사용한다.
from : http://way2java.com/servlets/java-made-clear-difference-servletrequest-httpservletrequest/


3. 설정하기. 
3.1 Filter 설정 

<filter>
  <filter-name>testFilter</filter-name>
  <filter-class>com.unclebae.filter.test.TestFilter</filter-class>
  <init-param>
    <param-name>name</param-name>
    <param-value>KIDO</param-value>
  </init-param>
</filter>

<filter-mapping>
  <filter-name>testFilter</filter-name>
  <url-pattern>/test/*</url-pattern>
</filter-mapping>

3.2 Interceptor 설정 

spring-context.xml

...
<interceptors>
  <interceptor>
    <mapping path="/test" />
    <beans:bean class="com.unclebae.interceptor.test.TestInterceptor"></beans:bean>
  </interceptor>
</interceptors>

4. 소스구조 
4.1 Filter 소스구조. 
package com.unclebae.testMvc.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class TestFilter implements Filter {
@Override
public void init(FilterConfig config) throws ServletException {
// 필터 초기화
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// 1. 선처리  작업
// 2. 다음처리 진행.
chain.doFilter(request, response);
// 3. 후처리 진행.
}
@Override
public void destroy() {
// 초기화 했던 작업들을 릴리즈 한다. }
}


4.2 Interceptor소스구조. 
- HandlerInterceptorAdapter를 이용한 소스 (Adapter은 인터페이스를 사전에 구현한 소스임)
package com.unclebae.testMvc.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
public class TestInterceptorUsingAdapter extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 전처리 수행
// true반환시 다음 실행, false실행시 다음 실행 불가 .
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//후처리 수행.
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 모든 view가 렌더를 마치고 수행.
}
}

- Interceptor 인터페이스를 이용한 소스
package com.unclebae.testMvc.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class TestInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object object) throws Exception {
// TODO Auto-generated method stub
return false;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response,
Object object, ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object object, Exception ex)
throws Exception {
// TODO Auto-generated method stub
}
}


[Spring] AOP 정리

[Spring] AOP 정리
AOP란?
AOP (Aspect oriented programming)의 약자이며, Spring framework 의 핵심 기능이다. 
AOP는 프로그램 로직을 concern이라는 작은 단위로 분리한다. 이러한 concern은 프로그램의 여러 위치에서 동작하며 이를 cross-cutting concern이라고한다.

AOP를 이용하면 좋은점 : 

AOP는 어떠한 서비스나 메소드를 호출할때 필요한 수행작업을 하면서도, 핵심 로직에 더 집중할 수 있도록 해주는 특별한 설계기법이다.

예를 들어 햄버거 만드는 과정을 하나의 서비스라고 해보자. 
이때 우리는 하나의 햄버거가 만들어 지는 시간을 측정해야할 필요가 생겼다고 하자. 

기존의 방법대로 프로그래밍을 해야한다고 한다면 우리는 햄버거 만드는 과정에 대한 서비스 자체를 수정해야한다. 
햄버거를 만들기 시작할때 스톱워치를 켜야하고, 햄버거를 만들고, 햄버거를 포장까지 하고난뒤 스톱워치를 정지하여 시간을 측정하는 기록지에 적어야 한다.

스톱워치를 시작하는 행위나 정지하는 행위 그리고 측정내역을 기록하는 행위는 햄버거를 만드는 핵심 서비스 과장과는 완젼히 상관이 없는 행위이다. 

이러한 작업을 수행하기 위해서 우리는 시간을 측정하는 기능을 AOP를 이용하여 기록하게 할 수 있고, 햄버거를 만드는 서비스는 수정할 필요 없다. 
즉, 이러한 핵심작업은 신경쓰지 않고 필요한 작업을 할 수 있고, 신뢰성이 있는 서비스를 제공해 줄 수 있으며, 나아가 햄버거 만드는 작업이 변경이 되더라도 시간을 기록하는 행위 자체를 또다시 분석하거나 손대지 않아도 된다. 

AOP는 핵심 기능에 충실하게 프로그래밍 할 수 있도록 하여, 더 견고하고, 확장성 있는 프로그램을 개발 할 수 있도록 해준다. 

AOP의 용어 :

1. Aspect : 
  - cross-cutting에 필요한 제공되는 API의 셋을 가지는 모듈이다. 
  - 예를 들어 로깅에 필요한 로깅모듈을 AOP의 aspect라고 부른다. 

2. Join point : 
  - AOP aspect 플러그인이 되는 프로그램의 위치를 의미한다. Spring AOP 프레임워크에서 사용되는 위치이다. 

3. Advice : 
  - 메소드가 실행되기 전이나 후에 실제 액션을 의미한다. 이것은 실제 프로그램이 수행되는 코드의 특정 조각이다. 

4. Pointcut : 
  - 이것은 하나 이상의 join point의 셋이다. 이는 표현식이나 패턴을 이용하여 AOP를 수행될 수 있도록 지정한다. 

5. Introduction : 
  - introduction은 존재하는 클래스에 새로운 메소드나 속성들을 추가하도록 허용한다. 

6. Target object : 
  - 하나 혹은 여러개의 aspect에 의해서 advice 받는 객체를 말한다. 이것은 항상 proxy된 객체이다. 

7. Weaving : 
  - Weaving은 aspect를 객체에 연결해주는 과정을 이야기한다. 이것은 컴파일타임에 완료되거나, 로드타임, 혹은 실행시점에 연결이 될 수 있다. 

AOP에서 Advice의 타입 
AOP에서는 5가지 advice 를 가진다. 

1. Before : 
  - 메소드가 실행되기 이전에 실행되는 advice이다. 

2. After : 
  - 메소드가 실행되고 나올때 수행되는 adivce이다. 

3. After-Returning : 
  - 메소드가 완젼히 수행된 이후에 수행되는 advice이다. 

4. After-throwing : 
  - exception이 throw되는 경우에 수행되는 advice이다. 

5. Around : 
  - 메소드가 호출되었을때 시작과 종료시점에 수행된다. 

적용 방식 : 
- Spring framework는 2가지 적용 방식을 제공하고 있다. 

1. XML Schema based : Sample Source Download 
  - Aspects를 일반적인 XML 방식의 설정으로 구현할 수 있도록 한다. 

  - @AspectJ 는 일반적인 자바5 이후의 annotation 을 이용한 선언적인 방식을 사용한다. 


























Spring Transactional Propagation

Spring Transactional Propagation

트랜잭션 전파 : 


MANDATORY
현재 트랜잭션을 지원한다. 만약 트랜잭션이 존재하지 않으면 exception을 던진다. 

NESTED
만약 현재 트랜잭션이 존재하는 경우라면, 중첩된 트랜잭션을 실행한다.
트랜잭션이 없다면 PROPAGATION_REQUIRED 처럼 동작한다.
NEVER
트랜잭션 없이 수행되도록 한다. 만약 트랜잭션이 존재한다면 exception을 던진다. 
NOT_SUPPORTED
트랜잭션을 지원하지 않는다.
원래 현재 트랜잭션은 대기한다. 
REQUIRED
현재 트랜잭션을 지원하며, 존재하지 않는다면 신규 트랜잭션을 생성한다. 
REQUIRES_NEW
신규 트랜잭션을 생성한다. 그리고 원래 현재 트랜잭션은 대기한다. 
SUPPORTS
Support a current transaction, execute non-transactionally if none exists.
트랜잭션을 지원한다. 트랜잭션이 존재하지 않았다면 트랜잭션 없이 수행한다. 




Spring Boot Part01

Spring Boot 

- Spring Boot의 주요 feature


1. Spring Boot starters
    - Spring Boot starters는 하나의 dependency로 필요한 많은 공통의 의존성을 모아놓은 것이다.
    - Maven이나 Gradle에서 간단히 추가해서 사용할 수 있다.

2. Autoconfiguration
    - Autoconfiguration은 Spring 4.0에서 지원되는 조건적 설정과 함께 필요한 설정을 자동추가한다.

3. Command-line interface (CLI)
    - CLI는 Groovy 개발자에게 자동 설정과 스프링 개발을 단순하게 해주는 기능을 제공한다.

4. Actuator
    - Actuator는 Spring Boot에 대해서 관리 기능을 제공해준다.


- Spring Boot 시작 패키지 다운로드 받기. 

http://start.spring.io


- 프로젝트 생성하기. 

1. Generate a [Gradle Project | Maven Project] 에서 필요한 프로젝트 관리 도구를 선택하자.


2. 프로젝트 기본항목 설정하기. :


Group : com.kido.media
Artifact : springboot-tutorial
Name : springboot-tutorial
Description : Demo project for Spring Boot
Package Name : com.kido.media
Packaging : Jar [War]
Java Version : 1.8
Language : Java

3. 필요한 Dependency 추가하기.

- Switch back to the simple version 을 누르면 필요한 Dependency를 추가할 수 있다.

3.1 Core Dependency

Core


Secure your application via spring-security

Aspect-oriented programming including spring-aop and AspectJ

JTA distributed transactions via Atomikos

JTA distributed transactions via Bitronix

Spring's Cache abstraction

Spring Boot Development Tools

JSR-303 validation infrastructure (already included with web)

Lombok

Web


Full-stack web development with Tomcat and Spring MVC

Websocket development with SockJS and STOMP

Contract-first SOAP service development with Spring Web Services

the Jersey RESTful Web Services framework

Spring Boot integration for the Ratpack framework

Vaadin

Exposing Spring Data repositories over REST via spring-data-rest-webmvc

HATEOAS-based RESTful services

Browsing Spring Data REST repositories with an HTML UI

Simplify the development of mobile web applications with spring-mobile

Document RESTful services by combining hand-written and auto-generated documentation

Template Engines


FreeMarker templating engine

Velocity templating engine

Groovy templating engine

Thymeleaf templating engine, including integration with Spring

Mustache templating engine

Data


JDBC databases

Java Persistence API including spring-data-jpa, spring-orm and Hibernate

Persistence support using Java Object Oriented Querying

MongoDB NoSQL Database, including spring-data-mongodb

Cassandra NoSQL Database, including spring-data-cassandra

REDIS key-value data store, including spring-redis

GemFire distributed data store including spring-data-gemfire

Apache Solr search platform, including spring-data-solr

Elasticsearch search and analytics engine including spring-data-elasticsearch

Cloud Core


Simplifies connecting to services in cloud platforms, including spring-cloud-connector and spring-cloud-cloudfoundry-connector

spring-cloud-context (e.g. Bootstrap context and @RefreshScope)

Secure load balancing and routing with spring-cloud-security

OAuth2 and distributed application patterns with spring-cloud-security

Cloud Config


spring-cloud-config Client

Central management for configuration via a git or svn backend

Configuration management with Zookeeper and spring-cloud-zookeeper-config

Configuration management with Hashicorp Consul

Cloud Discovery


Service discovery using spring-cloud-netflix and Eureka

spring-cloud-netflix Eureka Server

Service discovery with Zookeeper and spring-cloud-zookeeper-discovery

Service discovery with Cloud Foundry

Service discovery with Hashicorp Consul

Cloud Routing


Intelligent and programmable routing with spring-cloud-netflix Zuul

Client side load balancing with spring-cloud-netflix and Ribbon

Declarative REST clients with spring-cloud-netflix Feign

Cloud Circuit Breaker


Circuit breaker with spring-cloud-netflix Hystrix

Circuit breaker dashboard with spring-cloud-netflix Hystrix

Circuit breaker metric aggregation using spring-cloud-netflix with Turbine and server-sent events

Circuit breaker metric aggregation using spring-cloud-netflix with Turbine and Spring Cloud Stream (choose a specific Stream binder implementation to complement this)

Cloud Tracing


Distributed tracing via logs with spring-cloud-sleuth

Distributed tracing via Zipkin and spring-cloud-sleuth-zipkin

Cloud Messaging


A simple control bus with AMQP and spring-cloud-bus-amqp

A simple control bus with Redis and spring-cloud-bus

A simple control bus with Kafka and spring-cloud-bus

Inter instance control events with Hashicorp Consul

Messaging microservices with RabbitMQ

Messaging microservices with Redis

Messaging microservices with Kafka

Cloud AWS


AWS native services from spring-cloud-aws

Relational databases on AWS with RDS and spring-cloud-aws-jdbc

Messaging on AWS with SQS and spring-cloud-aws-messaging

Cloud Cluster


Leadership election and global state with Redis and spring-cloud-cluster-redis

Leadership election and global state with Zookeeper and spring-cloud-cluster-zookeeper

Leadership election and global state with Hazelcast and spring-cloud-cluster-hazelcast

Database


H2 database (with embedded support)

HSQLDB database (with embedded support)

Apache Derby database (with embedded support)

MySQL jdbc driver

PostgreSQL jdbc driver

Social


spring-social-facebook

spring-social-linkedin

spring-social-twitter

I/O


Spring Batch including HSQLDB database

Common spring-integration modules

Activiti BPMN workflow engine

Java Message Service API via Apache Artemis

Java Message Service API via HornetQ

Advanced Message Queuing Protocol via spring-rabbit

javax.mail

Ops


Production ready features to help you monitor and manage your application

API documentation for the Actuator endpoints

CRaSH shell integration





상기 기술된 의존성중 필요한 의존성을 추가하여 Spring Boot 프로젝트 생성하자.

우리는 여기서 Web, JPA 를 추가할 것이다.