Tagged: Spring Framework

Mybatis에 DAO 와 Mapper

SpringFramework 을 이용하다보면 데이터베이스 액세스를 위해서 MyBatis 를 사용하곤 한다. SQL 매퍼라고 불리기도 하는 것인데, 이를 이용하면 손쉽게 자바 코드와 SQL 문을 분리해줄 수 있을뿐만 아니라 MyBatis 에서 제공하는 여러가지 추가적인 기능을 이용해 데이터베이스를 좀 더 유연하게 사용할 수 있다.

DAO

보통 MyBatis 를 이용할대는 DAO 를 구조를 사용하곤 했다. Data Access Object 라고 불리는 것으로 말 그대로 데이터 접근을 위한 객체로서 sqlSession 객체를 이용해 데이터베이스 조회만 전담하는 객체다.

이 구조는 인터페이스와 그것을 구현한 구현체 클래스가 있어야 한다. 이를 위해서 Spring의 컨텍스트 설정을 해줘야 하는데 대략 다음과 같다.

sqlSession 을 빈으로 등록해준다. 그리고 다음과 같이 DAO 를 작성해 준다.

UserDAOImpl 은 UserDAO 인터페이스의 구현체다. SqlSession 의 빈을 가지고 오기 위해서 와이어를 걸어서 가지고 왔고, SQL 매퍼를 찾기위한 네임스페이스와 파라메터 인자를 주고 selectOne 메소드를 호출하고 있다.

이제 이것을 Service 계층에서, 역시나, 와이어를 걸어서 가지와서 데이터베이스에 데이터를 값을 호출하고 있다.

많은 프로젝트에서 이와 유사한 구조를 자주 보게 된다.

Mapper

그런데, 신기하게도 Mapper 을 이용해서 DAO 를 사용할 수도 있다. 이 기능은 MyBatis 3.0 이상부터 지원하기 시작한 것으로 Mapper 인터페이스만 구현하고 Service 계층에서 바로 와이어를 걸어서 사용할 수 있도록 했다.

하지만 DAO 구조에서도 얼마든지 Mapper 를 사용할 수 있다. sqlSession 에 메소드의 파라메터를 Mapper 클래스로 넘기면 된다. 먼저 Mapper 인터페이스를 다음과 같이 만든다.

그리고 앞에 DAO 구현체에 메소드를 다음과 같이 바꾼다.

sqlSession 객체에는 getMapper 는 메소드가 존재하고 이는 MyBatis 가 지원하는 Mapper 인터페이스를 받게 되어 있다.

문제는 MyBatis 의 namespace 인데, Mapper 인터페이스의 경로를 적어주면 되며 id 가 Mapper 인터페이스의 메소드 이름과 매핑된다.

이렇게 함으로써 Mapper 를 이용하면서도 DAO 구조를 그대로 유지할 수 있다. 문제는 DAO 에서 Mapper 인터페이스 객체를 매번 생성해 줘야 한다는 것이다. sqlSession.getMapper 를 이용해서 매번 가지고 오게 되는데, 이렇게 하는 것보다는 Spring Context 에서 빈으로 등록해 와이어로 가지고 오게 되면 DAO 가 아닌 Service 계층에서 호출이 가능하다.

다음과 같이 빈으로 등록한다.

이제 Service 계층에서 다음과 같이 와이어로 가지고 오고 바로 사용할 수 있다.

하지만 이렇게 할 경우에 Mapper 인터페이스 객체 하나하나 전부 Spring Context 에서 빈으로 만들어 줘야 한다. 그래서 이렇게 하지말고 Mapper 인터페이스를 스캔하도록 할 수 있는데 이를 위해서 mybatis-spring 라이브러리 패키지와 xsd 설정을 해줘야 한다. xsd 과 설정은 Spring Context 파일에 다음과 같이 해준다.

Mapper 인터페이스 클래스 파일들을 전부 위 설정에 나온 패키지 경로로 모두 옮긴다. 그리고 각 Mapper 인터페이스에 @Mapper 어노테이션을 붙여준다. 또한 매퍼 XML 에 네임스페이스 경로도 모두 위 설정으로 바꿔 준다.

이렇게 하면 DAO 관련 파일들은 전부 삭제해도 잘 동작 한다.

HTTP 응답 헤더 보안

의외로 웹 프로그래밍을 하는 사람들 조차도 HTTP 응답 헤더에 대해서 생각을 하지 않는다. HTTP 응답 헤더에 대한 생각을 하지 않는다는 것은 웹 프로그래밍을 깊게 공부한 사람이 아니라고 말할 수도 있다.

Cache Control

대부분의 사람들은 이 부분에 대해서는 잘 안다. Cache Control 헤더는 Client 에 컨텐츠를 어떻게 캐시할 것인지에 대한 제어를 할 수 있다.

하지만 고려해야할 사항이 존재한다. 만약 AWS Cloud 를 사용한다면 더 더욱 고려해야할 사항이 존재한다. AWS 의 CloudFront 는 CDN 서비스로서 컨텐츠 캐시를 기반으로 한다.

만일 특정 컨텐츠에 대해서 캐시를 하고 싶지 않다면 어떻게 해야할까? AWS 에서는 다음과 문서에 기술해 놨다.

사용자 지정 오리진 웹 서버 애플리케이션에서, Cache-Control no-cacheno-store 또는 private 명령을 CloudFront에서 캐시하지 않으려는 객체에 추가합니다. 또는 Expires 명령을 CloudFront에서 캐시하지 않으려는 객체에 추가합니다.

CloudFront에서 특정 파일 캐시를 방지하려면 어떻게 해야 합니까?

오리진(origin) 의 웹 서버나 애플리케이션에서 Cache-Control 헤더를 조작하도록 권고 하고 있다.

위는 응답 캐싱 정책을 정의하는 사용하는 헤더 지시문이다. Cache-Control 은 HTTP/1.1 사양의 일부로 정의 되었다. Expire 는 Cache-Control 이전에 사용했던 지시문이다. 현대의 대부분 브라우저는 HTTP/1.1 를 지원하지만 구형을 쓰는 곳이 있을 수 있음으로 Expire 지시문을 함께 사용한다.

no-cache 는 말그대로 캐시를 하지 말라는 것을 지시한다. 이 지시자를 쓸 경우에 매번 요청할 때마다 문서의 유효성을 검사한다. 그래서 컨텐츠가 변경된 경우에 최신 버전을 가지고 오게 된다. 컨텐츠의 변화를 감지하는 매커니즘을 가진다는 것이 매우 중요하다. 또 모든 것을 캐시를 하지 않는다. 예를들어, 비공계 개인 데이터와같은 것은 이 지시자로 캐시를 제어를 할 수 없다.

no-store 는 비공개 개인 데이터를 포함해 모든 캐시를 하지 않다록 해준다.

public, private 이라는 것도 있다. 이는 중간 캐시를 이용할 경우에 유용하다. 중간 캐시는 CDN 을 의미한다. 만일 CDN 과 같은 중간 캐시 서버가 캐시 데이터를 가지고 있기를 원하지 않는다면 private 를 써야 한다.

그리고 위 코드에 보이는과 같이 모든 것을 다 포함하도록 지시문을 사용해서는 안된다. Pragma, Expire 는 HTTP/1.0 스펙에서 유효하다. 거기다 Cache-Control 지시문에서 no-cache, no-store, max-age 를 한꺼번에 쓰는건 잘못된 것이다.

그래서 cache 전략이 필요하게된다. 이는 HTML 구조를 봐야 한다.

index.html 파일 안에 구조가 저렇게 되어 있다고 가정하면, 대략 다음과 같은 형태의 캐시 전략을 쓸 수 있다.

ContentsCache-Control
index.htmlCache-Control: no-cache
common.cssCache-Control: max-age=86400
a.jsCache-Control: private, max-age=86400

CSS 파일은 최대 1일까지만 캐시하도록 지시했고, Javascript 파일은 CDN 에서 캐시를 하지 못하도록 하고 브라우져에서 최대 1일까지만 캐시하도록 했다. index.html 은 no-cache 를 주어서 캐시를 하지 못하게 했지만 매번 요청할 때마다 변경이 되었는지 체크하고 변경되었다면 최신판을 새로 받도록 했다.

must-revalidate 가 있는데, 강제 사항을 적용할 때 사용 한다. 이는 다음과 같이 사용한다.

이 경우에 1일동안 캐시를 하고 그 이후에는 서버에 반드시 유효성검사를 하도록 강제한다. 만일 네트워크 상황으로 유효성 검사를 못할 경우에는 절대로 캐시 데이터를 사용하지 못하도록 한다.

이론을 기반으로 현실에서 사용 전략을 다음과 같이 세울 수 있다.

경우의 수Cache-Control
금융Cache-Control: no-store
장바구니, 결재 페이지Cache-Control: no-store
개인정보 수정 페이지Cache-Control: no-store
동적 웹 페이지Cache-Control: no-cache
정적 파일Cache-Control: max-age=86400

금융 관련된 웹 애플리케이션을 사용할 때에는 캐시를 되도록이면 하게 하면 안된다.

Nginx 와 같은 경우에 다음과 같이 HTTP Header 에 Cache-Control 을 붙일 수 있다.

Nginx 에서 max-age 설정은 expires 해도 된다. 이렇게 하면 구형의 Expire 지시자도 함께 지정된다.

Spring에서는 Spring-Security 에서 다음과 같이 지원한다.

위 설정은 다음과 같은 상태로 만든다.

만일 직접 캐시를 조작하고 싶다면 다음과 같이 해주면 된다.

Content Type Options

브라우저는 content sniffing 같은 기술을 사용해 다운받을려는 컨텐츠 타입을 추정하고 특정하게 된다. 하지만 이러한 것은 XSS 와 같은 공격을 제공하는 빌미가 된다. 그래서 이것을 방지하기 위해서 다음과 같이 헤더응답을 넣는다.

Spring Security 에서는 간단하게 설정할 수 있다.

HTTP Strict Transport Security(HSTS)

보통 사이트에 접속하는데에 프로토콜을(HTTPS, HTTP) 붙이지 않는다. 이럴 경우 브라우저는 HTTP 로 먼저 접속해보고 서버의 설정에 따라서 HTTPS 로 리다이렉트를 하게 된다.

만일 중간에 해커가 Proxy Server 를 두게되면 클라이언트는 HTTP 로만, Proxy Server 가 이를 받아서 HTTPS 로 뒷단 서버에 연결을 하게된다. 이렇게 되면 모든 정보를 볼 수 있게 된다. 이러한 해킹 기법을 “SSL Stripping” 공격 혹은 SSL/TLS Hijacking 이라고 부른다.

HSTS 는 애초에 접속을 HTTPS 로만 하라고 강제한다. 이는 브라우저와 서버 모두 HSTS 를 모두 지원해야 한다는 제한이 있지만 2010에 HSTS 에 대한 논의로 인해서 현재에는 모든 서버와 브라우저가 지원하고 있다.

HSTS 를 지원하는 브라우저는 도메인 목록을 유지한다. HTTPS 로만 접속 해야만 하는 도메인을 가지고 있게된다. 만일 HSTS 목록에 있는 도메인 주소를 억지로 HTTP 로 접속하게 되면 서버가 리다이렉트를 하는게 아니라 HTTPS 로 다시 접속하라고 브라우저에 요청하게 된다. HSTS 는 목록에 도메인을 유지하는 시간을 지정할 수 있다.

무조건 HTTPS 로만 접속하도록 강제하기 때문에 SSL 도메인 인증서가 있는 사이트에서만 사용 가능하다.

Spring Security 에서는 다음과 같이 간단히 적용할 수 있다.

X-Frame-Options

HTML 내에 또 다른 frame 을 넣는 기술은 자주 사용 되었었다. 최근에는 사용이 줄었지만 그래도 여전히 사용되어지는 기술이다. 하지만 이러한 frame 을 이용할 경우에 그것이 변조에 취약하다는 문제가 있다.

그래서 이 frame 을 실행하지 못하도록 브라우저에게 요청할 수 있는데, 이것이 X-Frame-Options 다. 기본 값은 DENY 이지만 같은 도메인의 frame 일 경우에는 허용할 수도 있다.

Spring Security 에서는 다음과 같이 설정할 수 있다.

SAMEORIGIN 일 경우에는 같은 도메인의 frame 일 경우에는 허용하게 한다.

X-XSS-Protection

XSS 를 브라우저에서 실행하도록 한다. 주의해야할 것은 서버의 웹 애플리케이션에서 하는게 아니라 브라우저의 XSS 필터에서 하는 것이다. 그러니까 서버에 요청을 넣기전에 브라우저가 사전에 XSS를 한번 차단하게 하는 것이다.

Spring Security 에서는 다음과 같이 설정할 수 있다.

CONTENT-SECURITY-POLICY

웹에 자원은 동일한 도메인에서만 작동되도록 설계되었다. 하지만 자신만의 스크립트를 삽입하는 XSS 공격을 고안해 냈다. 이를 방어하기 위해서 고안된 것이 CSP(Content Security Policy) 이다. 이것을 HTTP 헤더에 정의하면 브라우저에는 이곳에서 받은 리소스만 실행허거나 렌더링하도록 강제 한다.

Spring Seuciryt 에서는 다음과 같이 설정할 수 있다.

Spring 에서 기본

많은 웹 애플리케이션이 Spring 을 이용해서 만들어진다. 그리고 인증을 위해서 Spring Security 를 사용한다. 하지만 대부분의 소스를 보면 위에서 언급한 기본적인 보안조차 되어 있지 안되어 있는 곳이 대부분이다. 대기업의 프로젝트에서조차도 이런것을 고려하지도 않는다.

위에서 언급한 모든 내용은 다음과 같이 Spring Security 에서 간단하게 설정할 수 있다.

아주 간단하다. 그냥 가져다 붙여넣기만 해도 된다. 하지만 이것조차도 사용하지 않는 대기업 프로젝트가 부지기수다. 뭐가 기술력이 좋다는 건지… IT 선진국이라는 것이 좋은 인프라에 작동하기만 하면 되는 앱만으로 얻을 수 있는 거였다니..

Maven 다중 모듈 프로젝트 구성

STS Eclipse를 이용하면 손쉽게 Spring MVC 프로젝트를 구성할 수 있다. Spring MVC 프로젝트에는 Java 파일과 Web Content 파일을 모두 포함한다. 이를 Dynamic Content, Static Content 등로 구분하기도 한다.

문제는 이렇게 하나의 프로젝트에 모든 것을 담을 경우에 다음과 같은 문제가 발생할 수 있다.

  • 분리 배포가 불가능 하다. 요즘에는 WAS 앞에 Web 서버를 따로 두어 Static Content 를 서비스 하는 아키텍쳐가 많은데 하나의 프로젝트에 모든 것을 담게 되면 분리 배포가 어렵다.

단 하나의 큰 문제인데 이 문제를 가볍게 여길 수 없다. 실제 프로젝트를 할때에 이것을 간과해 나중에 아주 힘들어지는 경우가 허다 하다.

그래서 Spring MVC 기반의 프로젝트를 할때에는 Dynamic Content, Static Content를 분리해 진행하는 것이 좋은데, Maven 에서는 이를 ‘다중 모듈 프로젝트 구성’ 이라는 기능으로 제공하고 있다.

Root 프로젝트 생성

다중 모듈 프로젝트를 생성하는 첫번째는 Root 프로젝트 생성이다. 이름에서도 알수 있듯이 이 모든 모듈 프로젝트에 뿌리가 되는 프로젝트를 말한다.

이는 ‘Maven Project’ 를 통해서 생성 할 수 있다.

Maven Project 생성
Maven Project 생성

위와같이 Maven Project를 통해서 생성할때 한가지 주의해야 하는 것이 있는데, Pakaging 형태를 pom으로 해야만 한다. Root 프로젝트는 하위 프로젝트에 기반을 제공하는 것으로 별도 was 배포용 패키지를 만들지 않는다.

Root Project 에 pom Packaging
Root Project 에 pom Packaging

이렇게 하면 Root Project가 생성이 된다.

이 상태를 그대로 두고 Static Content를 위한 하위 프로젝트를 먼저 생성한다.

하위 프로젝트 생성(Static Content)

Static Content 를 위한 하위 프로젝트는 오로지 CSS, Java Script, Images 만을 위한 것이여서 Spring Mvc 샘플 프로젝트를 만들 필요는 없다. 간단하게 Maven Module 로 제작하면 된다.

앞에서 생성한 Root Project 에서 마우스 오른쪽 버튼을 눌러 Maven Module 생성하기를 시작한다. 그리고 다음과 같이 ‘maven-archetype-webapp’ 를 선택해준다.

Maven 으로 webapp 생성
Maven 으로 webapp 생성

이렇게 하면 Root Project 밑에 디렉토리로 하위 프로젝트가 위치하는게 보이고 이와 별도로 이클립스에 프로젝트로도 보인다.

Root 와 Static 프로젝트 모습
Root 와 Static 프로젝트 모습

Static 프로젝트에 pom.xml 를 보면 Root 프로젝트와 연결된 설정이 보인다.

이제 Static 의 디렉토리 구조를 바꾼다. 이는 이전에 글을 참고 하면 잘 나와 있는데 여기서는 WebContent 디렉토리만 인식시켜주면 되기 때문에 pom.xml 에 설정해주고 파일을 옮기면 된다.

그리고 Static 파일을 위한 디렉토리를 생성한 다음에 가짜 파일을 하나 만든다.

Static 파일을 위한 CSS, JS, Images 디렉토리 생성
Static 파일을 위한 CSS, JS, Images 디렉토리 생성

이렇게 한 후에 Build 를 하면 WebContent 이하 디렉토리 내용이 war 파일로 작성되어 진다. war 파일이긴하지만 Static만 있으면 되기 때문에 이 Static 파일만 담기도록 해보자. pom.xml 을 다음과 같이 수정 한다.

** 위와같이 설정해도 원하는데로 동작하지 않습니다. 아신다면 덧글 남겨 주시면 고맙겠습니다. **

이렇게 한 후에 SystemVLabs-Static 에 빌드를 하면 WebContent 디렉토리에 내용들이 war로 만들어진다. 또, RootProject 에서 빌드를 하면 하위 모듈로등록된 SystemVLabs-Static 도 빌드가 되면 정상적으로 프로젝트가 세팅된 것이다.

하위 프로젝트 생성(Dynamic Content)

이제 Dynamic Content 를 위한 하위 모듈 프로젝트를 생성해야 한다. 이는 여러 방법이 존재하는데, 내가 보기에 가장 손쉬운 방법을 설명하고자 한다.

먼저 STS Eclipse 의 Spring MVC 샘플 프로젝트를 생성한다. 그러면 기존의 RootProject와는 별도로 프로젝트가 생길 것이다.

Spring5 샘플 프로젝트
Spring5 샘플 프로젝트

이제 이것을 export 를 해주는데, File System 으로 export 를 한다.

Export를 File System 으로 한다.
Export를 File System 으로 한다.

대상 디렉토리는 RootProject 로 지정한다.

Spring5의 RootProject 로 Export
Spring5의 RootProject 로 Export

이렇게 한 후에 RootProject 를 ReFresh 하면 방금 Export 한 Spring5 디렉토리가 보인다.

이제 기존의 Spring5 프로젝트는 디스크에서 삭제도 체크해  삭제한다. 그리고 이제 프로젝트를 Import 한다.

Existing Project into Workspace
Existing Project into Workspace

“Existing Projects into Workspace” 를 선책하고 Next,

Export된 Spring5 디렉토리 지정
Export된 Spring5 디렉토리 지정

이렇게 하면 RootProject 하위가 아닌 독립된 프로젝트로 나타난다.

마지막으로 RootProject 의 pom.xml 에 방금 등록한 하위 모듈 프로젝트로 등록해 준다.

그리고 새로 등록한 하위 모듈 프로젝트의 pom.xml 에는 parent 모듈을 등록해 준다.

이렇게 함으로써 Dynamic Content 를 하위 모듈 프로젝트 등록은 다 된 것이다.

 

web.xml 스키마 예제 헤더

web.xml 스키마 헤더 예제는 버전별로 다음과 같다.

Servlet 2.5

Servlet 3.0

Servlet 3.1

Servlet 4.0

Servlet 5.0

Servlet 6.0

참고: IBM Knowledge Center

Spring MVC hello world Example in STS

spring pivotal이 글은 STS(혹은 Eclipse) 를 사용해서 Hello World 를 만드는 법에 대한 것이다.  Eclipse, STS 를 설치했다면 자체적으로 간단한 샘플 프로젝트를 제공 한다. 아무런 설정도 필요없고 간단하게 패키지명만 입력해주면 샘플 프로젝트가 제공되고 브라우저를 통해서 확인할 수 있다.

Eclipse 에는 Spring IDE 플러그인이 설치된 것으로 가정한다.

Spring Legacy Project

STS나 Eclipse 를 설치했다면 Spring Legacy Project 를 제공한다. File 메뉴 -> New -> Other.. 를 클릭하면 나오는 팝업창에서 ‘Spring’ 폴더를 클릭하면 다음과 같은 화면에 ‘Spring Legacy Project’ 가 보입니다.

Spring Legacy Project 생성 팝업
Spring Legacy Project 생성 팝업

이제 ‘Next’ 를 누르면 다음과 같은 화면이 나온다.

Spring 템플릿. 그런데 MVC Project 가 없다.
Spring 템플릿. 그런데 MVC Project 가 없다.

하지만 위 화면과 같이 나올 수도 있다. 원래는 MVC Project 가 나와야 하는데, 보이지 않는다. 그럴때는 위 화면에 ‘Configure templates…’ 를 클릭한다.

Template Projects 수정
Template Projects 수정

위 화면과 같이 두가지를 순차적으로 삭제 해준다. 위와같이 하면 이전화면이 다음과 같이 나온다. 삭제하고 난후에도 이전화면에서 ‘Spring MVC Project’ 가 나타나지 않으면 Eclipse 를 재시작해준다.

Spring MVC Project 생성
Spring MVC Project 생성

위 화면과 같이 Project name 에는 ‘HelloWorld’ 를 적어주고 아래 Template 은 ‘Spring MVC Project’ 를 선택하고 ‘Next’ 를 해준다.

패키지명 작성
패키지명 작성

위와같이 패키지명을 입력하고 난 후에 Finish 를 누르면 Hello World 프로젝트가 작성된다.

Spring MVC Project 로 작성된 Hello World
Spring MVC Project 로 작성된 Hello World

이를 실행시키면 Hello World 를 브라우져에서 확인해 볼수 있다.

UTF-8 로 출력하기

이는 Deployment Discriptor 인 Web.xml 파일에 Encoding 설정을 UTF-8 로 설정해 줘야한다. 이는 다음과 같다.

Session 공유 테스트 코드

WAS 서버를 세팅할때에 Session 을 공유하도록 가끔은 구성할 때가 있다. 요즘은 spring-data-redis 를 이용해서 Redis 에 Session 을 저장하도록 지원하고 있지만 WAS  서버 자체적으로 Session 을 공유하도록 설정해서 운영할 수 있다.

이때 과연 WAS  서버들간 Session 이 제대로 공유되고 있는지를 확인할 필요가 있는데 이때 사용할 수 있는 코드다. 참고로 이 코드는 다음의 github 저장소에서 가지고 왔다.

먼저, Controller 를 다음과 같이 수정한다.

그리고 다음과 같이 home.jsp 파일을 수정해준다.

위와같이 수정하고 실행을하면 세션관련된 내용을 출력되고 세션 공유를 테스트해 볼 수 있다.

JBoss EAP 에서 세션 공유

코딩만으로는 Session 공유가 되지 않는다. WEB-INF 디렉토리에 ‘jboss-web.xml’ 을 만들고 다음과 같이 작성한다.

그리고 web.xml 파일에 다음을 추가해 준다.

위와 같이 하면 웹 애플리케이션에서 세션이 공유된다.

Spring 개발을 위한 Eclipse 세팅하기

eclipse ide

이제 Java 개발을 하기위해서는 Eclipse가 필수가 됐다. 아니 Java 뿐만이 아니라 웬만한 언어들과 개발에 필요한 각종 인프라들을 제공해주는 단순한 하나의 IDE 가 아닌 개발환경 그 자체가 되어가는 듯한 느낌이다.

Java 개발에 거의 표준이 된 Spring Framework 를 이용한 개발을 할때도 Eclipse도 필수중에 필수이다.

Spring 개발을 위해 필요한 Eclipse 세팅에 대한 글이다. 초보자분들을 대상으로 함으로 이미 많은 경력을 쌓은 개발자는 읽을 필요가 없다.

준비물

현시점(2016.05)에서 안정적인 자바 개발을 위한 프로그램과 버전들은 다음과 같다.

  • Jdk 1.8
  • Maven 3.3.9
  • Eclipse 4.5.2 (mar2), STS 3.7.3

한가지 알아야 할 것은 STS 3.7.3 이다. Springsource Tools Suites 로서 Spring 개발사(?)에서 Eclipse 와 Spring Tools Suites 를 통합시킨 것이다. Eclipse 와 완전히 동일한 환경이지만 STS를 설치하면 별도의 Spring 을 위한 설치작업을 할 필요가 없기 때문에 많이 사용한다.

여기서는 Eclipse 4.5.2 를 가져다 Spring 을 위한 환경을 구축하는 것으로 하겠다. 설치와 환경설정으로 나뉘어 서술할 것인데, 설치를 제외한 환경설정 부분은 Eclipse 나 STS나 동일하기게 적용된다.

마지막으로 시스템은 Windows 64bit 을 사용하는 것으로 한다.

설치하기

Jdk 1.8 설치

먼저, Jdk 1.8 을 설치해야 한다. Maven 때문에 반드시 JDK를 설치해야 한다. Windows 64bit 버전을 다운받아 설치한다. 그리고 JAVA_HOME, CLASS_PATH, PATH를 시스템 환경 설정을 해준다. 이 과정은 검색해보면 많이 나오니까 따로 기술하진 않겠다.

Maven 3.3.9 설치

Maven 은 Java 개발에 필요한 각종 라이브리 의존성, 빌드, 테스트를 자동화해주는 툴이다. 대부분 Java 개발이 대규모로 이루어지고 있어 이러한 것을 자동으로 처리해주는 필요가 많이 생겼는데 Maven이 그걸 자동으로 해준다.

Eclipse 에서는 Maven 과 통합이 되어서 사용자가 별도의 명령어를 치거나하는게 아니라 Eclipse 에서 전부 Maven 관련된 일을 수행할 수 있다.

설치는 아주 간단하다. Maven 홈페이지에서 다운받아서 압축해제만 해주면 끝이다. 나는 압축을 해준 다음에 C:\ 디렉토리로 그냥 옮겨줬다.

  • C:\apache-maven-3.3.9

설치를 했다면 설정을 해줘야 한다. Maven 설치한 디렉토리에 repository 라는 디렉토리를 생성한다.

maven repository 디렉토리 생성
maven repository 디렉토리 생성

conf 디렉토리에 보면 setting.xml 파일을 텍스트 에디터로 열어서 다음과 같이 localRepository 부분에 방금 생성한 repository 디렉토리를 지정해준다.

Maven 자체에 대한 설정은 아주 많은데, 보통의 경우에 여기까지만 해도 개발하면서 이용하는데 아무런 문제가 되지 않는다.

Eclipse 설치

Eclipse 설치를 위해서 홈페이지에 가보면 다양한 Eclipse를 볼수 있다. 그것들은 마치 STS 와 동일한 것들이라고 보면 된다. C/C++ 를 위한 Ecclipse, PHP를 위한 Eclipse, Java 를 위한 Eclipse 등 많은 Eclipse 통합 제품들을 제공하는데 우리는 Java EE 를 위한 Eclipse 를 다운받는다.

  • Eclipse IDE for Java EE Developers

시스템 운영체제에 맞는것을 다운받으면 된다. 다 다운받으면 압축해제해서 C:\ 로 옮겨준다. 나 같은 경우에는 다음과 같다.

  • C:\eclipse-jee-mars2

Eclipse 설정

먼저 Eclipse 를 실행한다. 모든 설정은 Eclipse 실행한 상태에서 하게 된다.

실행을 했다면 ‘Help’ 메뉴 -> Check for Updates 를 실행해서 Eclipse 를 최신상태로 업데이트를 반드시 해준다.

Spring Tools Suites Plugin 설치

Plugin 설치는 Marketplace 를 이용해서 아주 쉽게 할 수 있다. ‘Help’ 메뉴 -> Eclipse Marketplace 를 클릭하면 Marketplace가 실행된다.

Marketplace 에서 Spring 으로 검색해서 설치버튼 클릭
Marketplace 에서 Spring 으로 검색해서 설치버튼 클릭

위 화면과 같이 ‘Spring’ 으로 검색해서 나오는 ‘Spring IDE 3.7.3.RELEASE’ 에 Install 클릭해준다. 그러면 화면이 바뀌고 설치하고자하는 추가 컴포넌트들을 선택하는 화면이나오는데 잘 모르면 그냥 ‘Confirm’ 클릭하고 라이센스에 동의해주고 ‘Finish’ 클릭하면 설치가 진행된다.

중간에 인증되지 않은 Plugin 을 설치하겠냐고 물어보는 팝업창이 나오기도 하는데 ‘Yes’를 해주면 설치가 완료 된다.

Maven 설정

Eclipse 를 실행하고 ‘Window’ 메뉴 -> Preferences 를 클릭하고 나오는 창에서 ‘maven’ 으로 검색한다.

maven 설정
maven 설정

위 화면과 같이 ‘User Settings’ 부분에 앞에서 Maven 설치시에 수정했었던 settings.xml 파일을 인식 시켜준다.

한가지 더 Maven 을 위한 설정이 존재하는데 다음과 같이 Jdk 의 tools.jar 을 library 에 포함시켜줘야 한다. 만일 이것을 하지 않게되면 Maven 사용시에 다음과 같은 오류를 만나게 될 수도 있다.

이는 tools.jar 을 필요로 하는 것인데 다음과 같이 인식시켜주면 된다.

tools.jar 추가해주기
tools.jar 추가해주기

이로써 Spring 개발을 위한 설정은 모두 끝났다.

하지만, 추가적인 필요한 설정을 해주자.

Edit Encoding,  line delimiter 설정

Windows 에서 Eclipse 를 사용하게되면 Eclipse의 기본 파일 인코딩은 MS949로 시스템 기본 문자셋을 따른다. 하지만 지금 세상은 UTF-8 세상이 된지 오래다.

또, Line delimiter 라고 해서 한줄을 다 쓰고나서 Enter 를 누르면 ‘\n’, ‘\r\n’ 이 두가지 형태로 라인이 끝임을 마킹하게 되는데 이는 Windows 나 Unix 에 따라 다르다. 이는 개발한 애플리케이션이 어느 시스템에서 동작하는지에 따라 선택해준다. 나는 Unix 로 바꿔줬다.

Encoding, Line delimiter 변경
Encoding, Line delimiter 변경

Line Numbering

텍스트 화면 왼쪽에 줄번호를 보이게 하면 개발시에 아주 편리하다. 설정은 다음과 같이 한다.

Line Number 보이기
Line Number 보이기

Eclipse Color Themes 설치

개발을 하다보면 Edit에 Syntax Highlight 를 변경하고자 하는 욕구가 나온다. 이럴때에 Color Theme를 설치하고 바꿔주면 된다. 이것도 Plugin Marketplace 에서 설치가능하다.

Eclipse Color Theme 설정
Eclipse Color Theme 설정

Plugin 을 설치하고 나면 위와같이 전에 안보이던 Color Theme 가 나오고 많은 Syntax Highlight Color 들을 볼수 있고 원하는 것을 선택할 수 있게된다. (원래는 선택하면 미리보기 기능을 제공했지만 현시점(2016.05)에서는 어찌된 영문인지 ‘곧 돌아온다’라는 문구만 나온다.)

이로써 Spring 개발을 위한 Eclipse 세팅에 대해서 간단히 알아봤다.