스프링을 이용한 프로젝트를 해야 해서 Spring 공식 웹사이트에서 maven, gradle 튜토리얼을 따라하고 몇 가지 튜토리얼을 따라한 다음, 본격적으로 개발을 하려면 역시 책을 봐야 겠구나 하고 한빛 리얼타임 시리즈의 《스프링을 이용한 RESTful 웹 서비스 구축하기 – 실전 예제로 배우는 REST 방식의 스프링 웹 서비스》를 샀다. 1만 2천 원이나 했는데, 다행히 전자 캐시가 4천 9백 원이나 있어서 7천 백 원에 샀다.

데이터베이스를 다루는 데까지 했는데, 정리를 좀 해 본다. 지금까진 거의 세팅만 했다. 이 세팅을 헷갈려 하면 안 되니까 한 번 정리를 하고 넘어가는 것이다.

메이븐 프로젝트 생성

메이븐 프로젝트 생성 명령은 아래와 같다.

mvn archetype:generate

기본 정보들을 인자값으로 넘겨 주면 아래와 같다.

mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false

-DarchetypeArtifactId의 값으로 maven-archetype-webapp을 주면 웹 애플리케이션 기반 프로젝트를 생성한다. 즉, 이건 프로젝트의 타입을 고르는 옵션이다.

pom.xml에 컴파일러 플러그인과 리소스 플러그인은 기본적으로 추가해 줘야 한다.

메이븐이 생성하는 기본 디렡토리 구조는 아래와 같다.

  • src/main/java
  • src/main/resources
  • src/main/webapp
  • src/test/java
  • src/test/resources
  • target

로깅 라이브러리

로깅 라이브러리로 Log4J를 많이 사용하는데, 더 뒤에 나온 Logback이 더 좋다. 속도도 10배 빠르고, 서버 재부팅 없이 로그 레벨을 변경할 수 있다.

로그 라이브러리를 뭘 사용하건 간에 상관없게 만들려면 SLF4J를 사용하면 된다. 이놈은 로그를 감싸서 API를 통일하는 놈인 것 같다. Log4j, Logback, JUL 같은 로깅 라이브러리를 지원한다.

logback.xml은 resources 패키지에 둔다.

인간 친화적 개발환경을 만들어 주는 Pojomatic 라이브러리

equals(Obj), hashCode(), toString() 메서드를 오버라이드해 주는 라이브러리인 것 같은데, 아직 나온 건 toString() 메서드를 덮어쓴 거다. 객체 주소를 출력해 주지 않고 내용을 출력하게 변경한다. 아놔 이런 걸 원했다고!

web.xml

maven-archetype-webapp로 생성한 프로젝트에서 web.xml 파일의 위치는 src/main/webapp/WEB-INF/다.

Spring Web MVC를 이용해서 웹 어플리케이션을 개발하려면 web.xml에 서블릿을 스프링 걸로 설정해 준다.

<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>

스프링에서 사용하는 이 DispatcherServlet은 초기화 값(init-param)으로 두 개를 설정해 줘야 한다.

  • 컨텍스트 클래스(contextClass) : 설정 클래스를 파싱해서 설정값을 가져오는 역할을 하는 클래스라고 한다. 설정 클래스엔 @Configuration이라는 어노테이션을 붙여 주는 것 같다.
  • 컨텍스트 설정 위치(contextConfigLocation) : 설정 클래스 위치. package를 써 주더라.

서블릿이 잡아챌 URI 모양도 설정해 준다. 서블릿은 이름을 지정해서 여러 개 설정한 뒤, 각 서블릿별로 잡아챌 URI를 다르게 할 수 있다.

이 때 두 개의 서블릿은 독립적인 서블릿이 되는데, 그럼 각자의 Bean을 공유할 수 없게 된다. 만약 공유를 해야 한다면 listener를 설정하면 된다. 자세한 내용은 44~46p에 나와 있다. 필요할 때 찾아 보련다.

Mapper

이 책은 MyBatis를 사용하는데, MyBatis는 DAO를 Mapper라고 부른다. 그래서 이 책에선 Mapper라고 용어를 쓴다.

DataSource는 설정 클래스에서 설정하면 된다.

자바 인터페이스를 만들고, 그걸 고대로 따라서 매퍼 xml을 만들면 된다. 예컨대 net.mytory.common.mapper.PersonMapper 인터페이스를 만들고, 그 안에 메서드로 List<Book> select(); 라고 적었다면, 이 xml에서는 mapper 태그의 namespace 프로퍼티에 이 인터페이스 경로를 적어 주고 select 태그 안에 쿼리를 적는다. 자세한 내용은 생략.77~81p에 잘 나와 있다.

근데 이렇게만 하면 안 되고 또 설정 클래스(contextConfigLocation에 설정한 패키지에 있는 자바 클래스. @Configuration 어노테이션이 있는 클래스)에 @MapperScan(패키지 경로) 어노테이션을 적어 준다.

그니까 스프링은 각각 만들고 죄다 설정 클래스에다 적어 주는 거다. 그럼 설정 클래스가 지휘를 한다.

이 외에 설정 클래스에 다음을 적어 준다.

  • 트랜잭션 매니저
  • sql 세션 팩토리

테스트

테스트 코드는 src/test/java 폴더 하위에 작성한다. 패키지명은 동일하게 하고, 테스트할 클래스명 뒤에 Test라고 접미사를 붙인다.

테스트 클래스 상단에 @RunWith(SpringJUnit4ClassRunner.class) 어노테이션을 붙여야 한다.

설정 클래스가 뭔지도 적어 줘야 한다. @ContextConfiguration(classes={클래스명.class}) 이렇게. 근데 여기선 패키지 경로 넘기고 스캔하는 방법은 없나?

테스트 결과를 볼 때는 아래 명령어를 사용한다.

mvn -e test

-e 옵션은 실행 중 발생한 오류를 출력하도록 하는 것이다.

특정 테스트케이스만 실행하고 싶으면 아래처럼 쓴다.

mvn -e test -Dtest=테스트클래스명