1. Spring 개발환경 설정
1.1 Spring 개발환경 설정
1.1.1 스프링 개발 툴
1.1.1.1 이클립스 + 스프링 플러그인
1.1.1.2 STS(Spring Tool Suite - 이클립스에 스프링 플러그인이 포함된 버전)
1.1.1.3 IntelliJ
1.1.2 STS 다운로드 및 설치
STS 4 다운로드(윈도우 64bit용 다운로드)
- 압축을 해제한 후 eclipseec.exe 실행
- 에러가 발생할 경우 - 환경변수에 JAVA_HOME, path에 JAVA_HOME/bin 추가
- 주의: sts 설치디렉토리 및 workspace는 한글 이름이 들어간 디렉토리를 사용하지 말 것
1.1.3 STS 3 플러그인 추가 설치
STS 4부터는 Spring Legacy Project를 지원하지 않으므로 Eclipse Marketplace에서 Spring Tools 3 Add-On 3.9.7.RELEASE를 추가 설치해야 함
1.1.4 프로젝트 기본 설정
기본 인코딩을 UTF-8로 변경
html/css/JSP의 인코딩을 UTF-8로 변경
JSP 페이지의 템플릿 변경
1.1.4.1 General - Workspace - Text File encoding 속성을 UTF-8로 변경
(변경하는 스샷)
1.1.4.2 General - Editors - Text Editors - Spelling - Encoding 속성을 UTF-8로 변경
(변경하는 스샷)
1.1.4.3 Web-CSS Files, Web-HTML Files, Web-JSP Files Encoding을 UTF-8로 변경
(변경하는 스샷)
1.1.4.4 JSP 템플릿 편집
Window → Preferences → Web → JSP Files → Editor → Templates → New JSP File(html) 선택 후 → Edit 클릭
(변경하는 스샷)
1.1.4.5 DOCTYPE을 HTML 4.01에서 HTML5 형식으로 변경
변경 전
변경 후
바) Get 방식의 한글데이터 처리(Tomcat 구버전)
Server.xml 편집
URIEncoding="UTF-8" 속성 추가(2군데)
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1"
redirectPort="8443" URIEncoding="UTF-8" />
<Connector port="8009" protocol="AJP/1.3"
redirectPort="8443" URIEncoding="UTF-8" />
1.2 Spring sample 프로젝트를 다운로드 받은 후 압축을 풀고 import
(google drive - sample.zip)
1.3 spring01 프로젝트 생성
- Spring Legacy Project → Spring MVC project
- 패키지 이름: com.example.spring01
- 메이븐 라이브러리: 사용자/.m2 디렉토리 확인
- JDK 버전 수정: Project Facets, Java compiler 버전 확인
- Spring 버전 변경: pom.xml 수정
<java-version>1.8</java-version>
<org.springframework-version>5.1.4.RELEASE/<org.springframework-version>
- 2019년 1월 현재 스프링의 최신 버전은 5.1.4이며 에러가 발생할 경우 하위 버전으로 설정(Java 최신 버전은 11이지만 호환성을 위하여 1.8로 설정함)
JDK 8+ for Spring Framework 5.x
JDK 6+ for Spring Framework 4.x
JDK 5+ for Spring Framework 3.x
- sample 프로젝트에서 설정파일 복사
- pom.xml 복사
- src/main/resources/mappers 디렉토리 생성
- src/main/resources/mappers/sampleMapper.xml 복사
- src/main/resources/log4j.xml 복사
- src/main/resources/log4jdbc.log4j2.properties 복사
- src/main/resources/logback.xml 복사
- mybatis-config.xml 복사
- src/main/webapp/WEB-INF/web.xml 복사
- src/main/webapp/WEB-INF/spring/root-context.xml 복사
- src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml 복사
- 톰캣 9.0으로 변경하여 실행
- Java Build Path에서 Tomcat을 추가할 것
- home.jsp 페이지의 한글이 깨짐, 페이지 지시어 수정 및 meta tag 추가
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Home</title>
</head>
<body>
<h1>Hello world!</h1>
<p>The time on the server is ${serverTime}.</p>
</body>
</html>
1.4 home.jsp의 실행과정
web.xml 웹 프로젝트의 배치 기술서
deploy descriptor
웹 프로젝트의 환경 설정 파일
/WEB-INF/spring/root-context.xml
스프링의 환경설정 파일
스프링에 내장된 DispatcherServlet을 Default 서블릿으로 설정
- 모든 서블릿 요청은 DispatcherServlet에서 처리됨
/WEB-INF/spring/appServlet/servlet-context.xml 참조
xml 파일 안에 정의된 객체들을 로딩함
HomeController.java 로딩됨
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring/appServlet/servlet-context.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
bean을 xml로 등록하는 방법
<bean id="참조변수" class="클래스이름">
</bean>
<bean id="homeController" class="com.example.spring01.HomeController">
</bean>
HomeController homeController = new HomeController();
bean을 자동으로 검색해서 등록
<context:component-scan base-package=*"기준 패키지 경로"* />
- @Controller: 컨트롤러 빈
- @Repository: DAO(데이터베이스 관련 작업) bean
- @Service: 서비스(비즈니스 관련 로직) bean
- @Inject: 의존관계 주입
1.5 스프링의 디렉토리 구조
- src/main/java - 자바 코드(Controller, Model, Service)
- src/main/resources - 자바 코드에서 참조하는 리소스 파일들
sqlMapConfig.xml, mybatis의 mapper - src/test/java - 테스트 관련 코드
- src/test/resources - 테스트 코드에서 참조하는 리소스 파일들
- src/main/webapp - 웹 서비스 루트 디렉토리(외부에서 접근 가능)
- src/main/webapp/resources - js, css, image 등의 웹 리소스 파일
- src/main/webapp/WEB-INF/classes - 컴파일된 클래스
- src/main/webapp/WEB-INF/spring - 스프링의 환경설정 파일
src/main/webapp/WEB-INF/spring/root-context.xml - 서블릿과 관련되지 않은 모든 리소스에 대한 설정
src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml - 서블릿과 관련된 리소스에 대한 설정 - src/main/webapp/WEB-INF/views - html, jsp 페이지
- src/main/webapp/WEB-INF
외부에서 접근 불가능(보안을 위해서)
컨트롤러를 경유해서 접근 가능 - pom.xml - 메이븐에서 참조하는 설정 파일
1.6 스프링의 주요 특징
- POJO(Plain Old Java Object) 기반의 구성: 별도의 API가 필요하지 않은 일반적인 자바 코드를 이용하여 개발 가능
- 의존성 주입(DI)을 통한 객체 간의 관계 구성
- AOP(Aspect Oriented Programming) 지원: 반복적인 코드를 줄이고 개발자가 비즈니스 로직에만 집중할 수 있도록 지원함
- 편리한 MVC 구조
- WAS에 종속적이지 않은 개발 환경
1.6.1 IoC(Inversion of Control, 제어의 역전) - 객체에 대한 제어권
- 기존에는 개발자에게 제어권이 있음(new 연산자)
- 객체의 제어권을 스프링에게 넘김
- 인스턴스의 라이프 사이클(생성부터 소멸까지)을 개발자가 아닌 스프링 프레임웍이 담당
1.6.2 DI(Dependency Injection, 의존관계 주입)
- 객체 간의 의존성을 개발자가 설정하는 것이 아닌 스프링 컨테이너가 주입시켜 주는 기능
- 객체를 쉽게 확장하고 재사용할 수 있음
1.6.2.1 의존 관계
B의 코드가 변경되면 A의 코드도 변경되는 경우
A와 B는 의존관계가 있다.
A는 B에 의존한다.
A B
코드 변경 발생 유연한 확장이 어려움
```note. BoardDAO.java
MemberDAO.java → 관련된 코드를 바꿔야 함
(코드 변경 상황 시)
강한 결합과 느슨한 결합
B의 코드 변경에 A에 영향을 미치지 않도록 느슨하게 설계
A B
코드 변경 불필요 유연한 확장이 가능함
핵심 기능의 변경이 쉬워짐
강한 결합은(결합도가 높으면) 유지보수를 어렵게 함
한 곳의 수정 -> 나비효과
1.6.2.2 강한 결합과 느슨한 결합
// 생성자가 private으로 바뀌면// MemberUse class도 수정해야 함public class MemberUse { public MemberUse() { Member m = new Member(); }} class Member { String userid; String passwd; String name; private Member() { }} | // 생성자가 private으로 바뀌어도// 영향을 받지 않음public class MemberUse { public MemberUse(Member m) { }} class Member { String userid; String passwd; String name; private Member() { }} |
---|---|
1.7 maven repository 조회
1.8 메이븐 빌드 에러 발생시 해결 방법
- Java Build Path에서 JDK 버전을 1.8로 조정
- Project Facets에서 JDK 버전을 1.8로 조정
- [프로젝트] - [Properties] - [Deployment Assembly] - [Add] - [Java Build Path Entries] - [Maven Dependencies] 선택
- pom.xml에서 spring version 조정
- 프로젝트 clean, server clean
- STS를 종료한 후 메이븐 저장소(.m2) 삭제, STS 재시작