1. Prologue
2. 개발 환경 세팅
A. 개발 환경 항목별 버전 체크
B. 개발 환경 세팅 과정
1) JDK 설치
2) Eclipse 설치 및 Spring 다운로드
3) Tomcat 설정
4) Spring 프로젝트 생성
* 라이브러리 버전 수정
* 서버 세팅
https://immose93.tistory.com/8
5) MariaDB, MySQL Workbench 설치 및 샘플 DB 구축
* SQL developer로 MySQL Workbench 사용
6) Spring, MariaDB, MyBatis 연동, 데이터 조회
* pom.xml 수정
* root-context.xml 수정
* mybatis-config.xml 작성
* logback.xml 작성
* log4jdbc.log4j2.properties 작성
* test.xml 작성
https://immose93.tistory.com/9
데이터 조회/처리를 위한 Java 코드 작성
다음같은 구조로 자바코드 파일을 생성하고 작성
(1) MovieDAO.java
MovieVO를 담고 있는 List를 가지는 함수(selectMovie())가 있는 interface
package com.moses.dao;
import java.util.List;
import com.moses.vo.MovieVO;
public interface MovieDAO {
public List<MovieVO> selectMovie() throws Exception;
}
(2) MovieDAOImpl.java
SqlSession을 통해 등록된(test.xml) SQL 쿼리문을 실행하여 List를 리턴
package com.moses.dao;
import java.util.List;
import javax.inject.Inject;
import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;
import com.moses.dao.MovieDAO;
import com.moses.vo.MovieVO;
@Repository
public class MovieDAOImpl implements MovieDAO {
@Inject
private SqlSession sqlSession;
private static final String Namespace = "com.moses.mybatis.sql.test";
@Override
public List<MovieVO> selectMovie() throws Exception {
return sqlSession.selectList(Namespace+".selectMovie");
}
}
(3) MovieService.java
service interface로서 service 구현 객체 MovieServiceImpl에서 MovieService를 구현
package com.moses.service;
import java.util.List;
import com.moses.vo.MovieVO;
public interface MovieService {
public List<MovieVO> selectMovie() throws Exception;
}
(4) MovieServiceImpl.java
service는 비즈니스 로직을 작성하는 곳이며, DB 처리를 할 때 많이 이용
MovieDAO 객체를 의존 주입(DI, Dependency Injection)DI에 관한 쉬운 설명 : https://poqw.github.io/di_1/
package com.moses.service;
import java.util.List;
import javax.inject.Inject;
import org.springframework.stereotype.Service;
import com.moses.dao.MovieDAO;
import com.moses.service.MovieService;
import com.moses.vo.MovieVO;
@Service
public class MovieServiceImpl implements MovieService {
@Inject
private MovieDAO dao;
@Override
public List<MovieVO> selectMovie() throws Exception {
return dao.selectMovie();
}
}
(5) HomeController.java
@Controller 어노테이션으로 HomeController가 컨트롤러 매핑 대상이 될 수 있음
@RequestMapping에서는 호출하기 위한 URL의 path를 "/" 로 설정하여 기본 주소로 request를 보낼 시 매핑 됨
HomeController에서는 @Inject된 service에서 selectMovie를 호출(SQL 호출)하여 data를 리턴받아 movieList에 담고, 이를 model에 "movieList"라는 이름으로 담아 "home"이라는 이름을 가진 view로 전달될 수 있도록 함
return “home”;은 home.jsp를 view로 정하고 data 전달하라는 의미
package com.moses.springtest;
import java.util.List;
import java.util.Locale;
import javax.inject.Inject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.moses.service.MovieService;
import com.moses.springtest.HomeController;
import com.moses.vo.MovieVO;
@Controller
public class HomeController {
private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
@Inject
private MovieService service;
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home(Locale locale, Model model) throws Exception{
logger.info("home");
List<MovieVO> movieList = service.selectMovie();
model.addAttribute("movieList", movieList);
return "home";
}
}
(6) MovieVO.java
VO 클래스는 캡슐화 하고자 하는 DB 테이블의 컬럼명과 동일하게 멤버변수를 가지면 됨
getter와 setter를 통해 멤버변수에 접근함
(이클립스 getter, setter 자동 생성 방법 : kanu.tistory.com/32 )
package com.moses.vo;
public class MovieVO {
private String movie_name;
private String director;
private String types;
public String getMovie_name() {
return movie_name;
}
public void setMovie_name(String movie_name) {
this.movie_name = movie_name;
}
public String getDirector() {
return director;
}
public void setDirector(String director) {
this.director = director;
}
public String getTypes() {
return types;
}
public void setTypes(String types) {
this.types = types;
}
}
servlet-context.xml
경로 : src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml
@Controller 어노테이션이 붙은 클래스가 컨트롤러임을 알 수 있게끔 <annotation-driven />이 추가되어 있음
beans로 views에 있는 jsp 파일로 호출하겠다는 home.jsp 호출 정보가 담겨있음
컨트롤러 mapping시 scan할 base-package로 HomeController가 있는 com.moses.springtest를 설정
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
<!-- Enables the Spring MVC @Controller programming model -->
<annotation-driven />
<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
<resources mapping="/resources/**" location="/resources/" />
<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
<context:component-scan base-package="com.moses.springtest" />
</beans:beans>
home.jsp 작성
List<MovieVO>타입의 movieList를 받아 c:forEach문으로 조회된 결과를 뿌려주도록 했음
(실무에서는 보통 데이터를 json으로 받아와 dom id를 설정한 후, javascript, jquary 등으로 동적으로 뿌림)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<title>Home</title>
</head>
<body>
<h1>Hello world!</h1>
<table>
<thead>
<tr>
<th>영화이름</th>
<th>감독</th>
<th>장르</th>
</tr>
</thead>
<tbody>
<c:forEach items="${movieList}" var="movie">
<tr>
<td>${movie.movie_name}</td>
<td>${movie.director}</td>
<td>${movie.types}</td>
</tr>
</c:forEach>
</tbody>
</table>
</body>
</html>
Tomcat 세팅 변경
7) 결과 화면
3. Epilogue
3번의 포스팅에 걸쳐서 spring 프로젝트를 위한 개발 환경 세팅을 해보며 다시 한번 복습하는 시간을 가졌다.
아직은 세팅 단계 하나하나에 담겨있는 원리와 이론에 대해 정확하게 이해하지 못한 부분도 있지만, 앞으로 계속 부딪혀보며 좋은 개발자가 되기 위해 필요한 내용들을 공부할 것이다.
그동안 C/C++만 배웠다가 올해부터 Java와 Spring을 공부하게 되었다.
그리고 배운것에 대한 기록도 이제서야 시작하게 되었다.
개발하면서 발생하는 이슈를 해결했다고 그냥 넘겨버리지 않고, 사소한 것이라도 기록하는 습관이 몸에 배도록 해야겠다 :D
'Programming > Spring' 카테고리의 다른 글
[Spring] boolean 타입에 대한 @Getter (1) | 2021.05.18 |
---|---|
[Spring] validation (유효성 검사) (0) | 2021.05.12 |
[STS] STS 다크 테마 적용법 (0) | 2021.01.30 |
[Spring] Spring 개발 환경 세팅 (2/3) (0) | 2020.02.15 |
[Spring] Spring 개발 환경 세팅 (1/3) (0) | 2020.02.15 |