[Spring] JAVA에서 Spring으로 변환 정리 (개인 공부 정리용)

2022. 4. 22. 23:25·개발 공부/Spring
728x90
반응형

스프링 학습 후 개인적으로 정리하기 위한 글이므로 잘못된 부분들이 많을 수 있습니다.  

 

설정 파일들의 읽는 흐름은

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&amp;useUniCode=yes&amp;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&amp;useUniCode=yes&amp;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";
		}
	}
}

 

 

728x90
반응형
저작자표시 비영리 동일조건 (새창열림)

'개발 공부 > 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
'개발 공부/Spring' 카테고리의 다른 글
  • [Spring] 인프런 스프링 입문 강의 정리 #4
  • [Spring] 인프런 스프링 입문 강의 정리 #3
  • [Spring] 인프런 스프링 입문 강의 정리 #2
  • [Spring] 인프런 스프링 입문 강의 정리 #1
9_yoon
9_yoon
배울게 넘쳐나는 개발 세상에서 묵묵히 걸어가며 지식을 쌓는 신입 개발자
  • 9_yoon
    개발저장소
    9_yoon
  • 전체
    오늘
    어제
    • 분류 전체보기 (104)
      • 알고리즘 (52)
        • BJ (40)
        • 프로그래머스 (0)
        • SWEA (10)
        • JO (2)
      • 이론 공부 (8)
        • 네트워크 (2)
        • 알고리즘 (2)
        • Java (1)
        • Web (2)
        • 기타 (1)
      • 개발 공부 (36)
        • Project (1)
        • JavaScript (1)
        • Typescript (1)
        • Spring (12)
        • Java (2)
        • Next JS (7)
        • React (3)
        • Vue (1)
        • Web (6)
        • 기타 (2)
      • 기타 (8)
        • SSAFY (7)
        • 일상 (0)
        • 회고 (1)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

    • Github
  • 공지사항

  • 인기 글

  • 태그

    Typescript
    백준
    styled component
    백준 1065
    김영한 인프런
    React
    spring
    NextJS
    스프링
    boj 1065
    김영한 스프링
    싸피7기
    SSAFY
    노마드코더 nextjs
    싸피 7기
    nextjs 시작하기
    노마드코더
    노마드코더 Next
    싸피
    SWEA
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
9_yoon
[Spring] JAVA에서 Spring으로 변환 정리 (개인 공부 정리용)
상단으로

티스토리툴바