스프링 학습 후 개인적으로 정리하기 위한 글이므로 잘못된 부분들이 많을 수 있습니다.
설정 파일들의 읽는 흐름은
pom.xml => (web.xml) => root-context.xml => servlet-context.xml 순이다.
1. pom.xml
: 필요한 lib들과 버전들을 추가해서 수정해준다. (db, jsp, junit 등)
2. web.xml
post를 사용하려면 그 전에 utf-8로 인코딩을 해줘야지 한글이 제대로 보인다. 그러므로 web.xml에 filter를 추가해줘야한다.
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
web.xml 에 적힌 순서대로 호출이 된다. root-conext.xml 을 읽은 다음에
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
DisPatcherServlet을 생성한다. DisPatcherServlet은 처음에 생성하면 텅 비어있다. 그렇기 때문에 init-param 태그를 사용해서 servlet-context.xml에 있는 내용을 토대로 DispatcherServlet을 채워준다.
<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>
예외처리를 해줄 수 있다. 만약 url에 해당하는 mapping 값을 찾지 못하는 경우 예외를 던질 수 있도록 다음과 작성한다.
<!-- DispatcherServlet이 해당 mapping을 찾지 못할 경우 NoHandlerFoundException를 발생하도록 설정 -->
<init-param>
<param-name>throwExceptionIfNoHandlerFound</param-name>
<param-value>true</param-value>
</init-param>
에러를 각각 설정해줄수도 있다.
<!-- 에러 페이지 설정. 에러 코드마다 설정해줄 수 있음 -->
<error-page>
<error-code>404</error-code>
<location>/error/notfound.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/error/servererror.jsp</location>
</error-page>
3. root-context.xml
: 스캔할 컴포넌트와 DI를 위한 자바빈 객체들을 선언해준다.
컴포넌트 스캔
<context:component-scan base-package="package.model, package.aop"/>
aop 사용하기 위한 설정
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
DB연결 설정
<!-- db 연결 설정 -->
<bean id="ds" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
<property name="driverClass" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/[]?serverTimezone=UTC&useUniCode=yes&characterEncoding=UTF-8"/>
<property name="username" value="[]"/>
<property name="password" value="[]"/>
</bean>
db연결 설정을 다르게 해줄 수도 있다 => JNDI사용하기
root-context.xml에서 위에서 작성한 내용을 지우고 다음과 같이 작성한다.
<!-- JNDI ???? -->
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/jdbc/[]"></property>
</bean>
그리고 webapp/META-INF폴더의 context.xml을 생성해서 DB연결(connection pool)을 위한 정보들을 적어준다.
<context.xml>
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource name="jdbc/[]" auth="Container" type="javax.sql.DataSource"
maxTotal="100" maxIdle="30" maxWaitMillis="10000"
username="[]" password="[]" driverClassName="com.mysql.cj.jdbc.Driver"
url="jdbc:mysql://localhost:3306/[]?serverTimezone=UTC&useUniCode=yes&characterEncoding=UTF-8"/>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>
jndi의 value값에서 java:com/env/는 변경하면 안되고 그 뒤에있는 값은 context.xml의 resouce name과 맞춰줘야 한다.
ConnectionPool를 사용하면 getConnection()을 할때는 dataSource를 사용하고, close할때는 DBUtil를 사용한다.
+)추가로 DBUtil.java에 @Component도 추가해야하고, root-context.xml가서 scan 목록에도 DBUtil이 있는 패키지 명을 추가해줘야한다. 안그러면 에러난다..ㅎ
4. servlet-context.xml : web과 관련된 설정 파일들
<resources mapping="/img/**" location="/resources/img/"/>
<resources mapping="/css/**" location="/resources/css/"/>
위와 같이 선언을 해주면 경로를 사용할 때 Dispatcher-Servlet에게 가는 것이 아니라 선언한 경로로 가라고 알려준다.
img파일을 사용하려면 src를 입력해야하는데 그때 경로를 사용한다. 근데 경로를 사용하면 항상 Dispatcher-Servlet에게 어느 컨트롤러로 가야하는지 확인 후 해당 컨트롤러로 가게 되는데 이미지를 사용하는 경우에는 controller가 아닌 이미지나 css파일 등과 같은 resourses를 가져오기 위해서 사용하기 때문에 위와 같이 선언해주는 것이다.
DispatcherServlet이 찾아갈 수 있도록 controller를 스캔하는 부분을 추가해준다.
<context:component-scan base-package="com.ssafy.guestbook.controller" />
Log
controller/LoggingAspect.java
@After, @AfterReturning 등 원하는 어노테이션을 붙여서 AOP를 구현한다.
//메소드가 예외없이 실행된 이후
@AfterReturning(value="execution(* 패키지..클래스이름*.메소드*(..))", returning="obj")
public void afterReturningMethod(JoinPoint jp, Object obj) {
logger.debug("afterReturningMethod call method : {}", jp.getSignature());
logger.debug("return value :{}", obj);
}
Controller
servlet으로 작업했던 것들을 @Controller로 변경하고 어노테이션을 사용해서 DI를 해준다.
하나의 예시
@Controller
@RequestMapping("/article")
public class GuestBookController {
private static final Logger logger = LoggerFactory.getLogger(GuestBookController.class);
@Autowired
private GuestBookService guestbookservice;
@RequestMapping(value="/write", method=RequestMethod.GET)
public String write() {
return "guestbook/list";
}
//글 등록하기
@RequestMapping(value="/write", method=RequestMethod.POST)
public String write(GuestBookDto guestBookDto, Model model, HttpSession session) {
MemberDto member = (MemberDto) session.getAttribute("userinfo");
if(member != null) {
logger.debug("로그인 체킹 확인");
guestBookDto.setUserid(member.getUserid());
try {
guestbookservice.writeArticle(guestBookDto);
return "guestbook/writesuccess";
} catch (Exception e) {
e.printStackTrace();
model.addAttribute("msg", "글 등록중 문제 발생.");
return "error/error";
}
}else {
model.addAttribute("msg", "로그인 후 가능합니다.");
return "error/error";
}
}
}
'개발 공부 > Spring' 카테고리의 다른 글
[Spring] 인프런 스프링 입문 강의 정리 #5 (0) | 2022.06.26 |
---|---|
[Spring] 인프런 스프링 입문 강의 정리 #4 (0) | 2022.06.25 |
[Spring] 인프런 스프링 입문 강의 정리 #3 (0) | 2022.06.23 |
[Spring] 인프런 스프링 입문 강의 정리 #2 (0) | 2022.04.17 |
[Spring] 인프런 스프링 입문 강의 정리 #1 (0) | 2022.03.04 |