Java Web Development Workbook Chapter. 06
프론트 컨트롤러 디자인 패턴에서는 두 개의 컨트롤러를 사용하여 웹 브라우저 요청 처리
[ch06] 6.1 Implemented DispatcherServlet.
[ch06] 6.1 Updated servlets according to DispatcherServlet.
메서드 | 설명 | 반환값 |
---|---|---|
getRequestURL() | 요청 URL 리턴 (단, 매개변수 제외) | http://localhost:9999/web06/member/list.do |
getRequestURI() | 서버 주소를 제외한 URL | /web06/member/list.do |
getContextPath() | 웹 애플리케이션 경로 | /web06 |
getServletPath() | 서블릿 경로 | /member/list.do |
getQueryString() | 요청 매개변수 정보 | pageNo=1&pageSize=10 |
특정 작업 수행시, 사용하는 객체를 “의존객체”, 이 관계를 의존관계 라고 한다.
의존객체를 직접 생성 및 관리하는 것이 아닌 외부에서 주입 받는 방식
의존객체를 사용시, 구체적인 클래스 대신 인터페이스를 사용
[ch06] 6.3 Use dependency injection on MemberDao and interface.
다음과 같이 페이지 컨트롤러를 추가할 때마다 코드를 변경해야 함.
if ("/member/list.do".equals(servletPath)) {
}
else if ("/member/add.do".equals(servletPath)) {
if (request.getParameter("email") != null) {
model.put("member",
new Member().setEmail(request.getParameter("email"))
.setPassword(request.getParameter("password"))
.setName(request.getParameter("name")));
}
}
else if ("/member/update.do".equals(servletPath)) {
...
public interface DataBinding {
Object[] getDataBinders(); // new Object[] {"Data name", Data Type, "Data name", Data Type, ...}
}
[ch06] 6.4 Used reflection API.
다음과 같이 DAO나 페이지 컨트롤러를 추가할 때마다 ContextLoaderListener에서 코드를 변경해야 함
public class ContextLoaderListener implements ServletContextListener {
...
@Override
public void contextInitialized(ServletContextEvent event) {
try {
...
MemberDao memberDao = new MySqlMemberDao();
memberDao.setDataSource(dataSource);
sc.setAttribute("/auth/login.do", new MemberLoginController().setMemberDao(memberDao));
sc.setAttribute("/auth/logout.do", new MemberLogoutController());
sc.setAttribute("/member/list.do", new MemberListController().setMemberDao(memberDao));
...
}
ContextLoaderListener 에서 ApplicationContext를 생성 및 객체 관리
ApplicationContext 생성자가 호출될 때, 매개변수로 지정된 프로퍼티 파일의 내용을 로딩.
key 값을 통해 value (type)을 얻어 필요한 빈을 생성
for (Object item : props.keySet()) {
key = (String)item;
value = props.getProperty(key);
...
objTable.put(key, Class.forName(value).newInstance());
...
[ch06] 6.5 Used ApplicationContext.
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
public @interface Component {
String value() default "";
}
Annotation 정보를 언제까지 유지할 것인지 설정
@Retention(RetentionPolicy.RUNTIME)
Policy | Description |
---|---|
RetentionPolicy.SOURCE | 소스파일에서만 유지, 컴파일할 때 제거됨, 클래스 파일에 annotation 정보가 없음 |
RetentionPolicy.CLASS | 클래스파일에 기록됨, 실행시에는 유지되지 않음, 실행 중일 때는 클래스에 기록된 정보를 꺼낼 수 없음 |
RetentionPolicy.RUNTIME | 클래스파일에 기록됨, 실행시에도 유지됨. 실행 중일 때도 정보 참조 가능 |
Annotation 정책을 지정하지 않으면 디폴트로 RetentionPolicy.CLASS 로 지정됨
자바 classpath를 뒤져서 클래스 정보를 추출하기 위해 “Reflections” 오픈소스 라이브러리 사용
<dependency>
<groupId>org.reflections</groupId>
<artifactId>reflections</artifactId>
<version>0.9.10</version>
</dependency>
[ch06] 6.6 Use annotation to regiter bean with Reflections library.
[ch06] 6.7 Exercise #0, Implemented printing the list of projects.
[ch06] 6.7 Exercise #1, Implemented the management of projects.