Spring 기반의 웹 프로젝트를 구성하고 싶어요 T^T
우리의 목표는 DB와 연결하여 CRUD 기능을 수행할 수 있는 간단한 형태의 웹 프로젝트를 구성해 보는것!
그렇다면 Spring 기반의 웹프로젝트를 구성하는 단계는 어떻게 진행하면 좋을까??
- Spring 기반의 웹 환경 구축 (Test 페이지가 정상적으로 표시되는지 확인)
- 개발하기 편리한 것들 미리 설정!!
- JDBC를 활용한 DB 연결정보 설정
- 개발 GoGo
Spring 기반의 웹 환경 구축
1. web.xml 수정으로 Spring을 설정하는 방법
- 요즘 과연 이렇게 프로젝트를 수행하는 곳이 있을까??
- 예전에야 이렇게 하는 곳이 간혹 있었지만, Maven이 대세가 되버린 지금에서야 의미가 없긴 함 ㅡㅡ
- Maven이나 Ant, Gradle을 사용하지 못하는 상황이 있을수도 있으니 한번 살펴보기나 하자!!
(기존 프로젝트 구성 내역 참조)
2. eclipse Spring Plug-In을 활용한 템플릿 프로젝트 자동 구성
※ Eclipse에서 Spring Project를 생성하려면 당연한 이야기겠지만 플러그인을 설치해야 된다능....
!! 필요한 플러그인은 두가지 Maven과 STS
- Maven 플러그인 설치
2.1 먼저 이클립스 마켓플레이스에 접속!
- 어려울것 없음. 그냥 메뉴를 선택하면 마켓플레이스가 오픈됨 (Help -> Eclipse Marketplace)
- 누르면 마켓 플레이스 창이 오픈~ 거기서 검색을 위한 단어 입력 (find 항목에 maven 입력 후 엔터) -> 모를땐 사람들이 많으 쓰는 놈으로!! -> "Install " 버튼을 클릭하면 알아서 설치~
- STS (Spring Tool Suite)도 같은 방식으로 설치
- 자 이제 템플릿 프로젝트를 수행하기 위한 모든 준비가 완료!!!
- "뭐가 이리 어려워!! " 라고 할 수 있겠지만 한번 해 놓으면 다음부터는 않해도 되니까....
2.2 Spring 프로젝트를 생성하기 위해 "New Project"에서 Spring으로 필터!!
2.3 우리는 Spring 기반의 프로젝트를 생성할 예정이니 "Spring Templet Project"를 선택
2.4 웹 프로젝트를 생성할 예정이니 Spring MVC Project 항목 선택!! (첨엔 필요한 파일들을 다운 받으니 인터넷이 가능해야 함 ㅡㅡ;;)
2.5 지정하고 싶은 프로젝트 이름과 패키지 형태를 입력한 후 "Finish" 버튼을 클릭하자!!
2.6 자~~ 이제 돌려볼 수 있는 스프링 프로젝트가 생성되었다.
2.7 이제 바라는대로 프로젝트의 구조를 변경하면 된다.
필수는 아니지만 해놓으면 편리한 것들
1. slf4j를 활용한 Logger 생성을 편리하게 해보자
- 매 Class마다 변경해야되는 Class 명칭
- LoggerHelper Class를 만들어 손이 많이 가는 부분을 조금이라도 줄여보자.
As-Is : private static final Logger logger = LoggerFactory.getLogger( HomeController.class );
To-Be : private static final Logger logger = LoggerHelper.getLogger();
2. AOP설정
※ AOP란? ->Aspect-Oriented Programming 의 약자로 관점 지향 프로그래밍
항목 | 설명 |
---|---|
Before advice | joinpoint 전 수행 |
After returning advice | 예외처리 없이 종료되는 시점 수행 |
After throwing advice | 예외처리가 발생하는 시점 |
After (finally) advice | joinpoint를 빠져나갈 때 수행 (예외든 아니든 상관 X) |
Around advice | 시작부터 종료까지의 상태를 관장 |
- AOP를 설정하기 위해 XML에 직접 선언하는 방식과 Annotation을 활용하는 방식이 있는데.... 우리는 간단하게 Annotation을 활용해 봅시다.
- Annotation 기반의 AOP를 설정하기 위해서 우리가 해야할 일??
-> 이 한줄만 입력해 주시면 됩니다. <aop:aspectj-autoproxy />
- 그러면 AOP를 사용하기 위한 모든 준비는 완료!!! AOP를 동작 시키기 위한 Class를 작성해봅시다.
- 설정 참조
Pointcut | 선택된 Joinpoints |
---|---|
execution(public * *(..)) | public 메소드 실행 |
execution(* set*(..)) | 이름이 set으로 시작하는 모든 메소드명 실행 |
execution(* set*(..)) | 이름이 set으로 시작하는 모든 메소드명 실행 |
execution(* com.xyz.service.AccountService.*(..)) | AccountService 인터페이스의 모든 메소드 실행 |
execution(* com.xyz.service.*.*(..)) | service 패키지의 모든 메소드 실행 |
execution(* com.xyz.service..*.*(..)) | service 패키지와 하위 패키지의 모든 메소드 실행 |
within(com.xyz.service.*) | service 패키지 내의 모든 결합점 |
within(com.xyz.service..*) | service 패키지 및 하위 패키지의 모든 결합점 |
this(com.xyz.service.AccountService) | AccountService 인터페이스를 구현하는 프록시 개체의 모든 결합점 |
target(com.xyz.service.AccountService) | AccountService 인터페이스를 구현하는 대상 객체의 모든 결합점 |
args(java.io.Serializable) | 하나의 파라미터를 갖고 전달된 인자가 Serializable인 모든 결합점 |
@target(org.springframework.transaction.annotation.Transactional) | 대상 객체가 @Transactional 어노테이션을 갖는 모든 결합점 |
@within(org.springframework.transaction.annotation.Transactional) | 대상 객체의 선언 타입이 @Transactional 어노테이션을 갖는 모든 결합점 |
@annotation(org.springframework.transaction.annotation.Transactional) | 실행 메소드가 @Transactional 어노테이션을 갖는 모든 결합점 |
@args(com.xyz.security.Classified) | 단일 파라미터를 받고, 전달된 인자 타입이 @Classified 어노테이션을 갖는 모든 결합점 |
bean(accountRepository) | “accountRepository” 빈 |
!bean(accountRepository) | “accountRepository” 빈을 제외한 모든 빈 |
bean(*) | 모든 빈 |
bean(account*) | 이름이 'account'로 시작되는 모든 빈 |
bean(*Repository) | 이름이 “Repository”로 끝나는 모든 빈 |
bean(accounting/*) | 이름이 “accounting/“로 시작하는 모든 빈 |
bean(*dataSource) || bean(*DataSource) | 이름이 “dataSource” 나 “DataSource” 으로 끝나는 모든 빈 |
JDBC를 활용한 DB 연결 정보 및 트랜잭션 설정
1. DB 접속정보 설정
- DB 접속정보를 설정하기 위해서는 context-datasouce.xml에 DB 접속정보를 설정해 주면 됩니다.
( DBMS 종류에 따라 드라이버는 다르게 설정해야 함 -> 저는 오라클을 사용할 예정이어서 oracle.jdbc.driver.OracleDriver 드라이버를 사용합니다.)
- DataSource를 활용한 선언
(간단하게 접속정보를 지정할 수 있지만 설정 파일에 접속정보가 모두 나온다는 점을 주의해 주세요)
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"/>
<property name="username" value="id"/>
<property name="password" value="password"/>
</bean>
- JNDI 방식의 Lookup 방식
(WAS에 설정된 DB 접속 정보를 그대로 활용... WAS 벤더에 따른 설정방식이 달라서 불편한 점도 있습니다 ㅡ_ㅡ)
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/jdbc/slipp" />
</bean>
2. 트랜잭션 설정
- 트랜잭션을 설정하기 위해서 xml 기반의 설정과 annotation 기반의 설정 모두 가능합니다.
- 여기서는 xml 기반의 간단한 설정을 해보겠습니다.
- 트랜잭션 선언과 적용할 AOP 형태의 결합으로 간단한 트랜잭션의 적용이 가능합니다.
- 참고사항
속 성 | 설 명 | 사 용 예 |
---|---|---|
isolation | Transaction의 isolation Level 정의하는 요소. 별도로 정의하지 않으면 DB의 Isolation Level을 따름. | @Transactional(isolation=Isolation.DEFAULT) |
noRollbackFor | 정의된 Exception 목록에 대해서는 rollback을 수행하지 않음. | @Transactional(noRollbackFor=NoRoleBackTx.class) |
noRollbackForClassName | Class 객체가 아닌 문자열을 이용하여 rollback을 수행하지 않아야 할 Exception 목록 정의 | @Transactional(noRollbackForClassName=“NoRoleBackTx”) |
propagation | Transaction의 propagation 유형을 정의하기 위한 요소 | @Transactional(propagation=Propagation.REQUIRED) |
readOnly | 해당 Transaction을 읽기 전용 모드로 처리 (Default = false) | @Transactional(readOnly = true) |
rollbackFor | 정의된 Exception 목록에 대해서는 rollback 수행 | @Transactional(rollbackFor=RoleBackTx.class) |
rollbackForClassName | Class 객체가 아닌 문자열을 이용하여 rollback을 수행해야 할 Exception 목록 정의 | @Transactional(rollbackForClassName=“RoleBackTx”) |
timeout | 지정한 시간 내에 해당 메소드 수행이 완료되지 않은 경우 rollback 수행. -1일 경우 no timeout (Default = -1) | @Transactional(timeout=10) |
3. SqlMapper (myBatis) 연동 설정
- mybatis는 스프링과 쉽게 연동하여 sql 처리를 수월하게 해줄 수 있는 sql mapper입니다.
- DB에 접속하여 처리를 하기 위해서는 host, id, password 등이 필요하겠지만, 우리는 이미 datasource를 활용해서 해당 정보를 가져왔기 때문에 간단한 선언만 해주시면 됩니다.
- 그리고 mybatis 설정을 위한 설정파일과 SQL을 작성한 xml 파일 경로를 지정하시면 되구요.
- 전자정부표준프레임워크로 인증 받기 위해서는 전자정부에서 제공하는 @Mapper 어노테이션을 사용하셔야 합니다.
- 그러기 위해서 다음과 같은 전자정부 제공 라이브러리를 활용해서 Mapper 어노테이션을 스캔하셔야 합니다. (controller, service를 스캔한것 처럼요)
- 실제 동작이 되는 내용은 예제를 보시면서 동작해보도록 하겠습니다.
개발 GoGo
- 시간을 산정해 보고, 시간 여유가 있다면 직접 구현해 보겠지만... 시간이 안된다면 구현된 소스를 한번 리뷰하는 정보도로 마무리
1. 간단한 형태의 CRUD 기능이 구현된 기능 시연
2. 웹에서 기능 테스트
2 댓글
slipp017
제안을 해본다면...
둘 다 적은 분량이 아니랍니다. ㅡ0-);;
어떤 이야기를 해주실지 기대가 되는군요. 아... 이건 3주차 이야기에 더 가까우려나??
길기용
Spring 기반의 개발환경을 구성할때 어떤것 부터 해야할지 막막한 사람들을 위해 CRUD 기능을 구성할 수 있는 간단한
템플릿 프로젝트를 구성해 보는건 어떨까하는 생각...
요새 SI나 공공쪽에서 Hot한 전자정부 프레임워크를 적용해 볼까? ㅋㅋ