Mybatis Mapper 인터페이스란?


Mapper 인터페이스란?

여러 Mapper 인터페이스 작성시 설정한다.


Mapper 인터페이스란?

- 매핑파일에 기재된 SQL을 호출하기 위한 인터페이스이다.

- Mybatis 3.0부터 생겼다.

- 매핑파일에 있는 SQL을 인터페이스로 호출한다.


Mapper 사용하지않았을시?

- session.selectOne("userNS.selectUserById", id); 형식 이였다.

- 네임스페이스+"."+SQL ID 로 지정해야한다.

- 문자열로 작성하기때문에 버그가 생길 수 있다.

- IDE에서 제공하는 code assist를 사용할 수 없다.


Mapper 사용했을때

- Mapper 인터페이스 개발자가 직접작성한다.

- 패키지 이름+"."+인터페이스이름+"."+메서드이름이 네임스페이스+"."+SQL의 ID를 설정해야 한다.

- 네임스페이스 속성에는 패키지를 포함한 Mapper 인터페이스 이름 형식이다.

- SQL ID 에는 매핑하는 메서드 이름을 지정하는 것.


Mapper 인터페이스 작성

반드시 인터페이스로 선언해주어야한다.

네임스페이스 명은 패키지포함 인터페이스이름으로 작성. 

ex)<mapper namespace="myspring.user.dao.UserMapper">

메서드명은 SQLID와 동일하게작성.


사용하는법

-bean 추가

-xml네임스페이스 설정


-DAO에 autowired



-Mapper인터페이스 메소드명은 네임스페이스 ID랑 맞출것.

인터페이스

XML


여러개의 Mapper 설정 방법

- MapperScannerConfigurer사용한다.

- 위에 org.mybatis.spring.mapper.MapperFactoryBean 을 이용시 Mapper등록시 갯수가 많아지면일일이 정의해야하는 단점이 있다.

- DI컨테이너에 등록된다.

- MapperScannerConfigurer 이용하면 지정한 패키지 아래 모든 인터페이스가 Mapper 인터페이스로 간주된다.

dao등 인터페이스도 등록되어 에러가 생길 수 있다.


다른 인터페이스는 등록안되게 하는법

빈에 등록하기


annotation파일생성


기존 Mapper에 어노테이션 등록



'개발 소발 > 개발 Spring' 카테고리의 다른 글

SpringMVC란?  (0) 2018.01.11
MVC패턴이란?  (0) 2018.01.11
Mybatis 셋팅이란?  (0) 2017.12.21
MyBatis란?  (0) 2017.11.27
AOP어플리케이션 작성 (annotation)이란?  (0) 2017.11.27

json -> vo 매핑{json(array포함)} Gson사용


gson을 사용해서 vo와 매핑 되는걸 알고 있었는데...

json 안에 array가 있을때 매핑 방법을 찾게되었다.

찾아본 결과 json 데이터에 array가 있을땐

mainVO안에 List<subVO>를 만들어 사용하면 된다.

ex)


json파일 형식


MainVO 


subVO

MainVO와같은 형식으로 생성한다.


당연히 될줄알았던게 안되서 깜짝놀랐다. 확인해본결과

gson을 사용해서 list로 변환 하게되면 특수문자/가 치환되지않는 간단한 문제였다.

ex)

gson 사용시


출력 결과:

[{"test":"21100248891","link":[{"subtest":"https:\/\/codebeautify.org\/jsonviewer","@_subData":"20171212"},{"subtest":"https:\/\/codebeautify.org\/jsonviewer","@_subData":"20171213"}],"@_data":"21680485"},{"test":"21100248891","link":[{"subtest":"https:\/\/codebeautify.org\/jsonviewer","@_subData":"20171212"},{"subtest":"https:\/\/codebeautify.org\/jsonviewer","@_subData":"20171213"}],"@_data":"21680485"}]


치환이 안되어 있는 것을 확인 할 수 있다.

StringEscapeUtils.escapeHtml3(치환할문자열); <-형식으로 변경가능하다.

        



jsonsimple 사용시

출력결과:

[{test=21100248891, @_data=21680485, link=[{subtest=https://codebeautify.org/jsonviewer, @_subData=20171212}, {subtest=https://codebeautify.org/jsonviewer, @_subData=20171213}]}, {test=21100248891, @_data=21680485, link=[{subtest=https://codebeautify.org/jsonviewer, @_subData=20171212}, {subtest=https://codebeautify.org/jsonviewer, @_subData=20171213}]}]




jsonsimple이 자동으로  /를 치환해줌을 볼 수 있다.


VO매핑방법은 다시 gson을 이용하여 매핑해주면된다.

위방법으로 매핑하면 깔끔하게 매핑되는걸 확인할 수 있다.


추가)

배열 ArrayList로 변환하기


Mybatis 셋팅이란?


pom.xml에 추가한다.



1.설정해줘야한다. SqlSessionFactoryBean 

SqlSessionFactoryBean 

-DataSource(데이터베이스 커넥션)

-MyBatisConfig File(Mybatis 파일 위치정보)

(sqlMapConfig.xml)

-mapping File(쿼리SQL문을 포함)

(user.xml)



2.컴포넌트생성

(Mybatis제공 컴포넌트)

SqlSessionFactory 생성방법.




<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">

<constructor-arg ref="sqlSessionFactory" />

</bean>



3.SqlSessionFactory정보를 전달

SqlSessionTemplate(인터페이스 구현)


4.이 인터페이스를 구현한게 SqlSessionTemplate이다.

(Mybatis제공)

SqlSession(인터페이스)



SqlMapConfig.xml

vo클래스명 정리해준다.


User.xml

쿼리 포함된 mapping파일

namespace 이름 설정해준다. 


'개발 소발 > 개발 Spring' 카테고리의 다른 글

MVC패턴이란?  (0) 2018.01.11
Mybatis Mapper 인터페이스란?  (0) 2018.01.11
MyBatis란?  (0) 2017.11.27
AOP어플리케이션 작성 (annotation)이란?  (0) 2017.11.27
AOP어플리케이션 작성 (XML)이란?  (0) 2017.11.24

MyBatis란?


MyBatis의 개요와 특징

MYbatis와 Mybatis-Spring의 주요 컴포넌트

MyBatis-Spring 예제


MyBatis란?

- 자바 오브젝트와 SQL문 사이의 자동 Mapping 기능을 지원하는 ORM 프레임워크이다.

(Object relational Mapping)

- MyBatis는 SQL을 별도의 파일로 분리해서 관리하게 해준다.

- 객체-SQL 사이의 파라미터 Mapping 작업을 자동으로 해주기 때문에 많은 인기를 얻고있다.

- 새로우 DB프로그래밍 패러다임을 익혀야하는 부담없다.

- SQL문 그대로 이용하면서 JDBC 코드작성의 불편함도 제거해준다.

- 도메인 객체나 VO객체를 중심으로 개발이 가능한 장점있다.


MyBatis의 특징


쉬운 접근성과 코드의 간결함

- 가장 간단한 퍼시턴스 프레임워크(ORM)

- XML형태로 서술된 JDBC코드라고 생각해도 될만큼 JDBC의 모든 기능을 MyBatis가 대부분 제공한다.

- 복잡한 JDBC코드를 걷어내며 깔끔한 소스코드를 유지할 수 있다.

- 수동적인 파라미터 설정과 쿼리 결과에 대한 맵핑 구문을 제거할 수 있다.


SQL문과 프로그래밍 코드의 분리

- SQL에 변경이 있을 때마다 자바 코드를 수정하거나 컴파일 하지 않아도 된다.

- SQL작성과 관리 또는 검토를 DBA와 같은 개발자가 아닌 사람에게 맡길 수도 있다.


다양한 프로그래밍언어로 구현가능

- java,C#, .NET등


MyBatis3와 MyBatis-Spring의 주요 컴포넌트

Application     

 O/R

 JDBC

 JDBC

 Persistence

 Modules

 Mapper

 Interfaces

 Implementations

 Layer



JDBC는 저수준의 API

- JDBC를 MyBatis로 맵핑해서 사용(개발자가 사용편리)한다.


Data Access Layer에서 사용(DAO)



MyBatis3의 주요 컴포넌트

Mybatis설정파일(SqlMapCongif.xml)

- 데이터베이스의 접속 주소 정보나 Mapping파일의 경로(SQL포함한파일)등의 고정된 환경정보를 설정한다.

SqlSession Factory Builder(호출)

- 정보를 읽어온다.

- 읽어온 정보로 SqlSession Factory생성한다.

SqlSession Factory

- 읽어온 정보로 SqlSession 생성한다.

SqlSession(핵심역할)

- 컴포넌트 생성 개발자에게 리턴해준다.

- SQL문을 호출해주는 기능,트랜잭션 관리도 실행한다.




Beans.xml에서 설정해야하는 것.

SqlSessionFactoryBean


SqlSessionTemplate


MyBatis-Spring의주요 컴포넌트 역할이다.


Mybatis 설정파일

sqlMapConfig.xml

 - VO객체의 정보를 설정한다.

 SqlSessionFactoryBean

 - MyBatis설정파일을 바탕으로 SqlSessionFactory를 생성한다.

 - SpringBean으로 등록해야함

 SqlSessionTemplate

 - 핵심적인 역할을 하는 클래스로서 SQL실행이나 프랜잭션 관리를 실행한다.

 - SqlSession 인터페이스를 구현하며, Thread-safe하다(멀티스레드환경에서도 안전하게사용가능)

 - Sqpring Bean으로 등록해야한다.


 Mapping파일

 - SQL문과 OR Mapping을 설정한다.

 Spring Bean

 - SqlSessionFactoryBean을 Bean에 등록할 때

  DataSource정보와 MyBatis Config파일정보,Mapping파일의 정보를 함께 설정

 - SqlSessionTemplate을 Bean으로 등록



'개발 소발 > 개발 Spring' 카테고리의 다른 글

Mybatis Mapper 인터페이스란?  (0) 2018.01.11
Mybatis 셋팅이란?  (0) 2017.12.21
AOP어플리케이션 작성 (annotation)이란?  (0) 2017.11.27
AOP어플리케이션 작성 (XML)이란?  (0) 2017.11.24
AOP란?  (0) 2017.11.24

AOP어플리케이션 작성 (annotation)이란?


Aspect 클래스 선언 및 설정

Aspect 클래스 구현의 이해

Aspect 테스트


SpringAOP 구현방식

- XML

- Annotion


annotation 방식

- @Aspect 사용한다.

- XML설정파일에 <aop:aspectj-autoproxy />를 설정한다.


@Aspect 란?

- Aspect 클래스 선언할 때 사용한다.

- AspectJ 5버전에 새롭게 추가된 어노테이션이다.

- @Aspect 어노테이션을 이용할 경우 XML 설정 파일에 어드바이스와

포인트컷을 설정하는 것이 아니라 클래스 내부에 정의할 수 있다.

- <aop:aspectj-autoproxy />태그를 설정파일에 추가해서 사용한다.



xml설정파일에 추가



@Before("pointcut")

- 타겟 객체의 메서드가 실행되기 전에 호출되는 어드바이스이다.

- JoinPoint를 통해 파라미터 정보를 참조한다.


@After("pointcut")

- 타겟 객체의 메서드가 정상 종료됐을 때와 예외가 발생했을 때 모두 호출되는 어드바이스이다.

- 리턴값이나 예외를 직접 전달받을 수는 없다.


@Around("pointcut")

- 타겟 객체의 메서드가 호출되는 전,후 모든 과정을 담을수있는 강력한기능을 가진 어드바이스이다.


@AfterReturning(pointcut="",returning="")

- 타겟 객체의 메서드가 정상적으로 실행을 마친 후에 호출되는 어드바이스이다.

- 리턴값을 참조할 때는 returning 속성에 리턴 값을 저장할 변수 이름을 지정해야한다.


@AfterThrowing(pointcut="",throwing="")

- 타겟 객체의 메서드가 예외가 발생하면 호출되는 어드바이스이다.

- 발생된 예외를 참조할 때는 throwing속성에 발생한 예외를 저장할 변수이름을 지정해야한다.


@Before 어드바이스

- @Before 어드바이스를 이용해서 실행되는 타겟 객체의 메서드명과 파라미터를 출력하는 어드바이스이다.

- 아래의 before 메서드는 myspring 패키지 또는 그 하위 패키지에 있는 모든

public 메서드가 호출되기 이전에 호출된다.

ex)


@AfterReturning 어드바이스(정상적으로 종료되었을때)

- @AfterReturning어드바이스를 이용해서 실행되는 타겟 객체의 메서드명과 리턴값을 출력하는 어드바이스이다.

- 아래의 afterReturning 메서드는 myspring.user.service 패키지 하위에 있는 모든 public 메서드가 정상 종료된 이후에 호출된다.

- 리턴값을 참조할 때는 returning 속성을 이용해서 리턴 값을 담을 변수 이름을 지정해야한다.



@AfterThrowing 어드바이스(예외가 발생하였을때)

- @AfterThrowing 어드바이스를 이용해서 실행되는 타겟 객체의 메서드명과 예외메시지를 출력하는 어드바이스이다.

- 아래의 afterThrowing 메서드는 클래스명이 UserService로 시작되는 클래스에 속한 모든 메서드가 예외가 발생된 이후에 호출된다.

- 발생된 예외를 참조할 때는throwing 속성을 이용해서 예외객체를 담을 변수이름을 지정해야한다.



@After 어드바이스(정상적,예외 둘다 모두 호출)

- @After 어드바이스를 이용해서 실행되는 타겟 객체의 메서드명을 출력하는 어드바이스이다.

- afterFinally 메서드는 메서드명이 User로 끝나는 메서드들이 정상 종료됐을 때와 예외가 발생했을때 모두호출된다.

- 반드시 반환해야 하는 리소스가 있거나 메서드 실행 결과를 항상 로그로 남겨야하는 경우에 사용할 수 있다.

하지만 리턴 값이나 예외를 직접 전달받을 수는 없다.



'개발 소발 > 개발 Spring' 카테고리의 다른 글

Mybatis 셋팅이란?  (0) 2017.12.21
MyBatis란?  (0) 2017.11.27
AOP어플리케이션 작성 (XML)이란?  (0) 2017.11.24
AOP란?  (0) 2017.11.24
jdbc환경설정(mysql)이란?  (0) 2017.11.21

AOP어플리케이션 작성 (XML)이란?


Advice 클래스 작성에 대하여 이해

AOP 설정 및 테스트

PointCut 문법



SpringAOP의 구현방식

xml방식

@Aspect(어노테이션)방식


xml구현방식 절차

- Advice(부가기능)클래스 작성한다.

- xml파일에 <aop:config>를 이용해서 애스펙트를 설정한다.

(aspect애스펙트란? 어드바이스+포인트컷)


Advice의 종류

- Around어드바이스

타겟(핵심로직)메서드가 호출되기 이전(before) 시점과 이후(after) 시점에

모두 처리해야할 필요가 있는 부가기능을 정의한다.

Joinpoint 앞과 뒤에서 실행되는 Advice 이다.

- Before어드바이스

타겟(핵심로직)메서드가 호출되기 이전(before) 시점에 처리해야 할 

필요가 있는 부가기능을 정의한다.

Joinpoint 앞에서 실행되는 Advice 이다.

- After어드바이스

타겟(핵심로직)메서드가 정상적으로 실행된 이후(After)시점에 처리해야 할 

필요가 있는 부가기능을 정의한다.

Joinpoint 메서드호출이 정상적으로 종료된뒤 실행되는Advice 이다.

- AfterThrowing어드바이스

타겟(핵심로직)메서드가 예외를 발생된 이후(after)시점에 처리해야할 필요가 있는 부가기능을 정의한다.

예외가 던져질 때 실행되는 Advice 이다.


Advice클래스의 정보

클래스명 : PerformanceTraceAdvice.java

클래스 기능 : 이 어드바이스는 타겟 객체의 메서드 실행시간을 계산해서 출력해주는 부가기능을 제공한다.

advice유형 : Around 어드바이스

(타겟 객체의 메서드 실행 전, 후의 시간을 측정하여 계산하면 타겟객체의 메서드 실행시간을 알 수 있다.)

구현 메서드명:trace(ProceedingJoinPoint joinPoint)


JoinPoint인터페이스

- JoinPoint는 SpringAOP혹은 AspectJ에서 AOP가 적용되는 지점을 뜻한다.

- 해당지점을 AspectJ에서 JoinPoin라는 인터페이스로 나타낸다.

- JoinPoint에서 제공하는 메소드

 getArgs

 메소드 아큐먼트를 반환(오브젝트배열)

 getThis

 프록시 객체를 반환

 getTarget

 대상 객체를 반환(오브젝트형태)

 getSignature

 어드바이즈되는 메서드의 설명을 반환(메소드명,리턴타입)

 toString

 어드바이즈되는 메서드의 설명을 출력


- 모든 어드바이스는 org.aspectj.lang.JoinPoint 타입의 파라미터를 어드바이스 메서드에 첫 번째 매개변수로 선언해야한다.

- Around 어드바이스는 JoinPoint의 하위 클래스인 ProceedingJoinPorint를 필수적으로 선언해야한다.



JoinPoint(인터페이스)before,after사용한다.

    ↑

proccedingJoinPoint(상속받은 인터페이스) around사용한다.


proccedingJoinPoint 인터페이스란?

- around 조인포인트에서 사용한다.

- 계속해서 진행하다를 뜻이다.

- 타겟객체 앞뒤에서 모두사용할떄 사용한다.

- procced메서드 : 요청을 가로채 실행하고 타겟을 실행시킨다.

(아규먼트가 있는 메서드와 없는메서드가있음)



PerformanceTraceAdvice.class



bean설정방법

AOP설정




Advice를 정의하는 태그

<aop:before>

- 메서드 실행 전에 적요오디는 어드바이스를 정의한다.

<aop:after-returning>

- 메서드가 정상적으로 실행된 후에 적요오디는 어드바이스를 정의한다.

<aop:after-throwing>

- 메서드가 예외를 발생시킬 때 적용되는 어드바이스를 정의한다.

<aop:after>

- 메서드가 정상적으로 실행되는지 또는 예외를 발생시키는지 여부에 상관없이 어드바이스를 정의한다.

try-catch-finally에서 finally블록과 비슷하다.

<aop:aroung>

- 메서드 호출 이전, 이후, 예외발생 등 모든 시점에 적용가능한 어드바이스를 정의한다.



PointCut표현식



예제

execution([접근제한제 패턴] 타입패턴 [타입패턴.]이름패턴 (타입패턴|"..",...)


execution(* hello(..))

- hello라는 이름을 가진 메서드를 선정하는 것이다.

파라미터는 모든종류를 다허용한다.

execution(* hello())

- 위와동일하나 파라미터가없는것이다.


execution(* myspring.user.service.UserServiceImpl.*(..))

- myspring.user.service.UserServiceImpl 클래스를 직접 지정하여 

이 클래스가 가진 모든 메서드를 선택한다.


execution(* myspring.user.service.*.*(..))

- myspring.user.service 패키지의 모든 클래스에 적용한다.

하지만 서브패키지의 클래스는 포함되지 않는다.


execution(* myspring.user.service..*.*(..))

- myspring.user.service 패키지의 모든 클래스에 적용된다.

그리고 '..'를 사용해서 서브패키지의 모든 클래스까지 포함한다.


execution(* *..Target.*(..))

- 패키지에 상관없이 Target이라는 이름의 모든 클래스에 적용한다.

다른 패키지에 같은 이름의 클래스가 있어도 적용이 된다는 점에 유의해야한다.

'개발 소발 > 개발 Spring' 카테고리의 다른 글

MyBatis란?  (0) 2017.11.27
AOP어플리케이션 작성 (annotation)이란?  (0) 2017.11.27
AOP란?  (0) 2017.11.24
jdbc환경설정(mysql)이란?  (0) 2017.11.21
데이터엑세스개념(jdbc,springjdbc)이란?  (0) 2017.11.21

AOP란?


AOP의 개요와 용어

AOP의 특징 및 구현방식

Aspect와 SpringAOP설치


AOP의 개요와 용어

- 핵심기능(Core Concerns)

업무로직을 포함하는 기능이다.

- 부가기능(Cross-cutting Concerns)

로깅,보안등 부가기능이다.


객체지향의 기본 원칙을 적용하여도 핵심기능에서 부가기능을 분리해서 모듈화하는것은 어렵다.

하지만 AOP 개념을 적용하면 부가기능을 쉽게 분리할 수 있다.


AOP 개요

- 애플리케이션에서의 관심사의 분리(기능의분리)를 말한다.

- 즉, 핵심적인 기능에서 부가적인 기능을 분리하는 것.

- 분리한 부가기능을 애스펙트(Aspect)라는 독특한 모듈형태로 만들어서 설계하고 개발하는 방법이다.

- OOP를 적용하여 핵심기능에서 부가기능을 쉽게 분리된 모듈로 작성하기 어려운 문제점을 AOP가 해결해준다.

- 핵심기능과 부가기능을 분리하여 객체지향적인 가치를 지킬수 있도록 도와주는 개념이다.


Aspect란?

- 부가기능을 정의한 코드 어드바이스이다.(Advice와 어디바이스를 어디에 적용할지 정하는 포인트컷(PointCut)을 합친개념)

- Advice + PointCut = Aspect

- 핵심기능 코드 사이에 침투된 부가기능을 독립적인 애스펙트로 구분가능하다.

- 런타임시점에 필요한 부분에 동적으로 참여하게 가능이다.


AOP용어

- 타겟Target(핵심기능)

핵심기능을 담고 있는 모듈로, 타겟은 부가기능을 부여할 대상이 된다.

- 어드바이스(Advice)

어드바이스는 타겟에 제공할 부가기능을 담고 있는 모듈이다.

- 조인 포인트(Join Point)

어드바이스가 적용될 수 있는 위치를 말한다.

즉, 타겟 객체가 구현한 인터페이스의 모든 메서드는 조인 포인트가된다.

- 포인트 컷(PointCut)

어드바이스를 적용할 타겟의 메서드를 선별하는 정규표현식이다.

포인트컷 표현식은 execution으로 시작하고, 메서드의 Signature를 비교하는 방법을 주로 이용한다.

- 애스펙트(aspect)

애스펙트는 AOP의 기본 모듈이다.

애스펙트 = 어드바이스 + 포인트컷

애스펙트는 싱글톤 형태의 객체로 존재한다.

- 어드바이저(Advisor)

어드바이저 = 어드바이스 + 포인트컷

어드바이저는 Spring AOP에서만 사용되는 특별한 용어이다.

- 위빙(Weaving)

위빙은 포인트컷에 의해서 결정된 카겟의 조인포인트에 부가기능(어드바이스)를 삽입하는과정이다.

위빙은 AOP가 핵심기능(타겟)의 코드에 영향을 주지않으면서 필요한 부가기능(어드바이스)을 추가할 수 

있도록 해주는 핵심적인 처리과정이다.


기존(핵심,부가기능이 같이잇음)

한 로직 안에 PrimaryConcern,(핵심기능),Cross_cutting(부가기능) 두가지 모두 같이 있다

ex)로그인체크(부가기능), 회원리스트가져오기(핵심기능)


AOP

Weaving(핵심기능에 적용하는과정)

Pointcout (advice를 적용할 대상을 선별하는식) --------------> PrimaryConcern(핵심기능)

↑(advice)<=부가기능지칭

Cross_cutting(부가기능)


위에 Pointcut+advice = Aspect


로그인체크와 회원리스트가져오기를 분리한다.

회원리스트가져오기(핵심기능)

로그인체크(부가기능)

두가지로 분리하게된다.


Spring AOP의 특징

- Spring은 프록시(Proxy)기반 AOP를 지원한다.

타겟객체에 대한 프록시를 만들어 제공한다.

타겟을 감싸는 프록시는 실행시간(runTime)에 생성된다.

프록시는 어드바이스를 타겟객체에 적용하면서 생성되는 객체이다.    

- 프록시(Proxy)가 호출을 가로챈다.

프록시는 타겟 객체에 대한 호출을 가로챈 다음 어드바이스의 부가기능 로직을 수행하고

난 후에 타겟의 핵심기능 로직을 호출한다.(전처리 어드바이스)

또는 타겟의 핵심기능 로직 메서드를 호출한 후에 부가기능(어드바이스)를 수행하는 경우도 있다.(후처리어드바이스)


- 메서드 조인 포인트만 지원한다.

Spring은 동적 프록시를 기반으로 AOP를 구현하므로 메서드 조인 포인트만 지원한다.

즉, 핵심기능(타겟)의 메서드가 호출되는 런타임 시점에만 부가기능(어드바이스)을 적용할 수 있다.

반면에 AspectJ 같은 고급 AOP 프레임워크를 사용하면

객체의 생성, 필드값의 조회와 조작,static메서드 호출 및 초기화 등의 다양한 작업에 부가기능을 적용할 수 있다.


Spring AOP의 구현방식

XML의 기반의 POJO 클래스를 이용한 AOP구현

-부가기능을 제공하는 Advice클래스를 작성한다.

-XML 설정 파일에 Maop:config>를 이용해서 애스펙트를 설정한다.

(즉,어드바이스와 포인트컷을 설정함)

@Aspect 어노테이션을 이용한AOP 구현

-@Aspect어노테이션을 이용해서 부가기능을 제공하는 Aspect클래스를 작성한다.

Aspect클래스는 어드바이스를 구현하는 메서드와 포인트컷을 포함한다.

-XML설정파일에 (aop:aspectj-autoproxy />를 설정한다.



AspectJ와 SpringAOP 라이브러리 설치

Pom.xml에 추가



jdbc환경설정(mysql)이란?


JDBC 실행

실행전 환경설정(드라이버설치,라이브러리설치,Bean설정)


pom.xml(mysql과Spring-jdbc추가)




프로퍼티파일에 추가하기.


bean.xml에 추가하기.


Test 클래스 코드작성.


연결된것 확인방법.

콘솔로그에 com.mysql.jdbc.JDBC4Connection@31368b99 출력되는 것 확인한다.

데이터엑세스개념(jdbc,springjdbc)이란?


데이터엑세스공통개념

SpringJDBC


DAO(data access Object)패턴

- 데이터 액세스 계층은 DAO 패턴을 적용하여 비지니스 로직과 데이터엑세스 로직을 분리하는것이 원칙이다.

- 비지니스로직이 단순하다면 DAO와 Service를 통합할수도있지만 비지니스로직을 가지고있다면 반드시 분리한다.

- 서비스계층에 영향을 주지않고 데이터엑세스 가능하다.


컨넥션 풀링을 지원하는 DataSource

컨넥션풀링이란?

-미리정해진 개수만큼의 DB 컨넥션을 풀(Pool)에 준비해두고, 애플리케이션이 요청할때마나 꺼내서 할당하고 돌려받아 Pool에 넣는 기법이다.

다중사용자를 갖는 엔터프라이즈시스템 즉 웹어플리케이션에서는 반드시 DB컨넥션 풀링 기능을 지원하는DataSource를 사용해한다.

(실제 SQL실행시간보다 컨넥션객체 생성시간이 더걸리게됌)

스프링에서는 DataSource를 공유가능한 SpringBean으로 등록해 주어 사용할 수 있도록 해준다.


DataSource 구현클래스 종류

테스트환경을 위한DataSource

-SimpleDriverDataSource

스프링이 제공하는 가장 단순한 DataSource구현클래스이다.

getConnection()을 호출할 때마다 배번 DB 컨넥션을 새로만들고 따로 풀(pool)을 관리하지 않으므로

단순한 테스트용으로만 사용해야 한다.

-SingleConnectionDriverDataSource

순차적으로 진행되는 통합테스트에서는 사용가능하다.(멀티스레드 적합하지않음)

매번 생성하지않게때문에 SimpleDriverDataSource보단 빠르다.


DataSource종류

오픈소스 DataSource

-Apache Commons DBCP

가장유명한 오픈소스 DB커넥션 풀 라이브러리이다.

-c3p0 jdbc

c3p0는 jdbc3.0 스펙을 준수하는 Connection 과 Statement풀(pool)을 제공하는 라이브러리 이다.


두가지 모두 수정자(setter)메서드 제공 SpringBean으로 등록해서 사용하기편리하다.



JDBC란?

- 모든 자바의 데이터 액세스 기술의 근간이된다.

- 엔티티클래스와 애노테이션을 이용하는 최신 ORM기술이다.(Mybatis,hibernate등)

내부적으로는DB와 연동을 위해 JDBC를 이용한다.

- 안정적이고 유연한 기술이지만, 로우레벨기술이다.

    (WHY? 중복된 코드가 반복적으로 사용,DB에따라 일관성없는 정보를 가진채로 Checked Exception로 처리)



SpringJDBC란?

- JDBC의 장점과 단순성을 그대로 유지하면서도 기존JDBC의 단점을 극복한다.

- 단순한,간결한 형태의 API사용법을 제공한다.

- JDBCAPI에서 지원되지않는 편리한기능이다.

즉, JDBC를 개발자들이 사용하기쉽게 만든라이브러리


반복해야하는 작업을 대신 처리해준다.(실행할 SQL정의,실행될시 바인딩될 파라미터,넘겨받을 객체만설정해주면된다)

사용하려면 먼저 DB컨넥션을 가져오는 DataSource를 Bean으로 등록한후 사용해야한다.



Spring JDBC가해주는 작업

- Connection열기와 닫기

예외발생해도 Connection을 닫아준다.

- statement준비와 닫기

SQL정보가 담기는 Statement또는 PreparedStatement를 생성하고 필요한 준비작업을 해주는것도 해준다.

statement도 알아서 닫아준다.

- statament실행

sql던지고 다양한객체로 받아올수있게해준다.

- ResultSetLoop처리

ResultSet에 담김 쿼리 실행결과가 한건 이상이면 ResultSet루프를 만들어 반복해준다.

- Exception 처리와 반환

작업중 발생되는 모든 예외는 SpringJDBC예외변환기가 처리해준다.

즉 DataAccessException타입으로 변환해준다.

jdbc는 반드시 맞는 예외처리를 해주어야하는데 SpringJDBC는 안해도된다.

- Transaction처리

transaction와 관련된 작업을 알아서해준다.(커밋,롤백)


jdbcTemplate클래스

SpringJDBC의 모든 기능을 최대한 활용할 수 있는 유연성을 제공한다.

- 실행,조회,배치 세가지 작업이 있다.

실행

-INSERT UPDATE

조회

-SELECT

배치

-여러개의 쿼리를 한꺼번에 수행하게해준다.


JdbcTemplate클래스생성

- DataSource는 보통 Bean으로 등록해서 사용하므로 jdbcTemplate이 필요한 DAO클래스에서 DataSourceBean을 DI받아서

jdbcTemplate을 생성할때 인자로 넘겨주면된다.

- 멀티스레드환경해서도 안전하게사용가능하다.


업데이트 메서드

파라미터갯수는 가변인자(한개든 여러개든)가능하다.

결과값은 반영된 갯수이다.



queryForObject()메서드 (SELECT)

여러개의 칼럼,한개의 로우로 반환될때 사용한다.


query()

여러개의 칼럼,여러개의 로우로 반환될때 사용한다.



사용자관리프로젝트(컨트롤러,서비스,DAO,도메인모델)란?


사용자관리 프로젝트 아키텍쳐

- 계층화(역할별로 나누어서 개발)

3계층과 모든계층에 사용되는 도메인 모델(VO,DTO) 클래스로 구성되어있다.

3계층

-프리젠테이션계층

-서비스계층

-데이터액세스계층

각각계층은 독립적으로 구분에서 구현한다.(각각의 기능과 역할이 다름)


프리젠테이션계층(쉽게말해 컨트롤러)

- 웹클라이언트의 요청 및 응답을 처리한다.

- 상위계층(서비스,데이터액세스계층)에서 발생하는 익셉션 처리한다.

- 최종 UI에서 표현해야 할 도메인 모델 사용한다.

- 최종 UI에서 입력한 데이터에 대한 유효성 검증기능을 제공한다.(타입확인등)

- 비지니스로직과 UI분리한다.(컨트롤러)

- @Controller 어노테이션으로 표현한다.


서비스계층(비지니스 로직)

- 복잡한 처리 구현한다.

- 트랜잭션처리한다.(DB 커밋 및 롤백)

- 프리젠테이션계층과 데이터액세스 계층 사이를 연결하는 역할이다.(직접통신하지않아 유연성증가)

- 다른 계층들과 통신하기 위한 인터페이스를 제공한다.

- Service 인터페이스와 @Service 어노테이션을 사용하여 작성된 Service 구현 클래스이다.


데이터액세스계층

DBMS연동하여 데이터엑세스하는 로직을 담당한다.

- 데이터를 조회 등록 수정 삭제한다.(CRUD)

ORM 프레임워크(Mybatis,Hibernate)를 주로 사용하는 계층이다.

- DAO인터페이스 @Repository 어노테이션을 사용하여 작성된 DAO 구현 클래스이다.


도메인모델클래스

- VO,DTO객체에 해당한다.

- 3개의 계층에 걸쳐 사용한다.

- private 멤버변수있고, getter,setter로 사용한다.



사용자 관리 프로젝트 클래스 설계

테이블 생성


컨트롤러 -> 

서비스(인터페이스) ->

서비스임플(비지니스로직) -> 

DAO(인터페이스) -> 

DAOImpl(db연결 jdbc사용)

UserVO(전구역에걸쳐사용)


UserController

- UI계층과 서비스 계층을 연결하는 역할이다.

- JSP에서 UserController를 통해서 서비스 계층의 UserService를 연결한다.(@autowried사용)

- UserService 를IOC가 주입해준다.



UserService

- 서비스 계층에 속한 상위 인터페이스이다.


UserServiceImpl          

- @Service사용 -> @Component과 같음

- UserService를 구현한클래스이다.

- 복잡한 업무 로직이 있을 경우에는 이 클래스에서 업무 로직을 구현한다.

- 데이터액세스 계층의 UserDao 인터페이스를 구현한 객체를 IoC컨테이너가 주입해준다.(@autowried사용)


UserDao

- 데이터 액세스 계층에 속한 상위 인터페이스


UserDaoImplJDBC 

- @Repository -> @Component역할과 같다.(특별히 데이터엑세스 레파지토리라는 뜻)

- UserDao 인터페이스를 구현한 클래스로 이클래스에서는 데이터 액세스 로직을 구현한다.

- SpringJDBC를 사용하는 경우 DataSource를 IoC컨테이가 주입해준다.

- MyBatis를 사용하는경우에는 SqlSession을 IoC컨테이너가 주입해준다.




+ Recent posts