Error rendering WebPanel: No renderer found for resource type: velocity Template contents: <meta name="ajs-keyboardshortcut-hash" content="$keyboardShortcutManager.shortcutsHash">
메타 데이터의 끝으로 건너뛰기
메타 데이터의 시작으로 이동

Spring 기반의 웹 프로젝트를 구성하고 싶어요 T^T

우리의 목표는 DB와 연결하여 CRUD 기능을 수행할 수 있는 간단한 형태의 웹 프로젝트를 구성해 보는것!

그렇다면 Spring 기반의 웹프로젝트를 구성하는 단계는 어떻게 진행하면 좋을까??


  1. Spring 기반의 웹 환경 구축 (Test 페이지가 정상적으로 표시되는지 확인)
  2. 개발하기 편리한 것들 미리 설정!!
  3. JDBC를 활용한 DB 연결정보 설정
  4. 개발 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 advicejoinpoint 전 수행
After returning advice예외처리 없이 종료되는 시점 수행
After throwing advice예외처리가 발생하는 시점
After (finally) advicejoinpoint를 빠져나갈 때 수행 (예외든 아니든 상관 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 형태의 결합으로 간단한 트랜잭션의 적용이 가능합니다.

 - 참고사항

속 성설 명사 용 예
isolationTransaction의 isolation Level 정의하는 요소. 별도로 정의하지 않으면 DB의 Isolation Level을 따름.@Transactional(isolation=Isolation.DEFAULT)
noRollbackFor정의된 Exception 목록에 대해서는 rollback을 수행하지 않음.@Transactional(noRollbackFor=NoRoleBackTx.class)
noRollbackForClassNameClass 객체가 아닌 문자열을 이용하여 rollback을 수행하지 않아야 할 Exception 목록 정의@Transactional(noRollbackForClassName=“NoRoleBackTx”)
propagationTransaction의 propagation 유형을 정의하기 위한 요소@Transactional(propagation=Propagation.REQUIRED)
readOnly해당 Transaction을 읽기 전용 모드로 처리 (Default = false)@Transactional(readOnly = true)
rollbackFor정의된 Exception 목록에 대해서는 rollback 수행@Transactional(rollbackFor=RoleBackTx.class)
rollbackForClassNameClass 객체가 아닌 문자열을 이용하여 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 댓글

  1. 제안을 해본다면...

    • STS에서 Spring template project를 이용해서 template project 를 만들고, 이 프로젝트의 기본 설정들을 수정
      • pom.xml 수정
      • web.xml 수정
      • 필요에 따라서는 프로젝트 모듈 분리 하기
      • 참고 : https://github.com/ihoneymon/simple-module
        • 지금 진행하고 있는 프로젝트 시작할 때 뼈대 잡아둔 프로젝트
        • simple-module-core : Domain, Repository, Service 설정
        • simple-module-web : Controller, Web  설정
      • 기본 설정을 해둔 뼈대 프로젝트를 Github에다가 등록해두고 필요할 때마다 복사Clone 해서 프로젝트 아키텍처에 맞춰서 수정해서 쓰면 된다고 생각합니다. 
    • 또다른 하나는, Spring 3.1 부터 추가된 Java Configuration을 이용해서 web.xml에서 절정해야하는 것들을 Java 코드로 작성하여 대체하는 모습을 보여주면 어떨까요?...라고 조심스럽게 이야기해봅니다.
    • 안드로이드에서도 Lombok(http://projectlombok.org/)같은 애노테이션annotation을 이용해서 코드들을 줄이고 분리할 수 있게 되었습니다.
      • RoboGuice와 AndroidAnnotation 비교(http://ecogeo.tistory.com/325) 를 이용해서 분리하려는 노력을 하고 있습니다.
        • 이건 실제로 사용해본 적은 없고, 회사에서 스터디 시간에 사용하는 것을 본 적은 있습니다. ㅎㅎ

    둘 다 적은 분량이 아니랍니다. ㅡ0-);;

    어떤 이야기를 해주실지 기대가 되는군요. 아... 이건 3주차 이야기에 더 가까우려나??

  2. Spring 기반의 개발환경을 구성할때 어떤것 부터 해야할지 막막한 사람들을 위해 CRUD 기능을 구성할 수 있는 간단한

    템플릿 프로젝트를 구성해 보는건 어떨까하는 생각...

     

    요새 SI나 공공쪽에서 Hot한 전자정부 프레임워크를 적용해 볼까? ㅋㅋ