wisePocket

[Spring] Spring MVC Project 생성 및 작업 흐름 본문

(old)Java Backend study

[Spring] Spring MVC Project 생성 및 작업 흐름

ohnyong 2023. 6. 26. 21:07

프로젝트 생성
1. Spring Legacy Project > Spring MVC Project 선택하여 생성
2. 프로젝트 버전 설정
프로젝트 선택 + 우클릭
properties
+java compiler -> Build Path -> 11로
+Project Facets -> Java version 11로

3. 프로젝트/pom.xml 아래와 같이 변경.

<properties>
<java-version>1.6</java-version>
<org.springframework-version>3.1.1.RELEASE</org.springframework-version>
<org.aspectj-version>1.6.10</org.aspectj-version>
<org.slf4j-version>1.6.6</org.slf4j-version>
</properties>
부분 찾아서 아래처럼 수정
>>>>>>>>>>
<properties>
<java-version>11</java-version>    <<<<<<<<< 11
<org.springframework-version>5.0.7.RELEASE</org.springframework-version> 
  <<<<<< 5.0.7
<org.aspectj-version>1.6.10</org.aspectj-version>
<org.slf4j-version>1.6.6</org.slf4j-version>
</properties>

4. 프로젝트/pom.xml 아래와 같이 변경.
<!-- Servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>

부분 찾아서 아래처럼 수정
>>>>>>>>>>

<!-- Servlet 111p-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>  <<<<< javax.servlet-api
<version>3.1.0</version>   <<<<<<< 3.1.0
<scope>provided</scope>
</dependency>


5. 프로젝트/pom.xml 아래와 같이 변경.--------------------

     <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.5.1</version>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                    <compilerArgument>-Xlint:all</compilerArgument>
                    <showWarnings>true</showWarnings>
                    <showDeprecation>true</showDeprecation>
                </configuration>
            </plugin>

부분 찾아서 아래처럼 수정
>>>>>>>>>>

             <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.5.1</version>
                <configuration>
                    <source>11</source>   <<<<<<<< 11
                    <target>11</target> <<<<<<<< 11
                    <compilerArgument>-Xlint:all</compilerArgument>
                    <showWarnings>true</showWarnings>
                    <showDeprecation>true</showDeprecation>
                </configuration>
            </plugin>







6. 그 외 모듈 
https://mvnrepository.com/ 에서 각종 모듈 추가

<!-- Add My Module ====================== -->
아래
<!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${org.springframework-version}</version>
<scope>test</scope>
</dependency>
...
이렇게 추가

spring-test
lombok
mybatis
spring-ibatis
ojdbc8
spring-jdbc
dbcp
HikariCP

등 검색해서 추가.


이렇게 수정하고 저장하면 자동 빌드

7. 프로젝트 선택 > Maven > Upadate Project 누르면
 변경된 버전들 플러그인을 다운로드 받는다.
/Users/inyongkim/.m2
경로는 이곳이다.

//////////////// 서버 생성 //////////////////

8. new-server
Apache Tomcat v9.0
선택
경로 톰캣 경로 선택
JRE 사용중인 11g 선택

Window/Perspective/Open Perspective
Other/Server 추가


9.WEB-INF/web.xml 설정 살펴보기
<context-param>
<param-value>/WEB-INF/spring/root-context.xml</param-value>
이파일이 Bean들을 등록하는 곳이다. ------> 아래 신규 경로로 변경될 것이다.

<servlet>
<init-param>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
이파일이 MVC에서 Command.properties 비슷한것이다. FrontController 역할이다.


10.
src/main/java/com.my.multiweb/HomeController.java에서
view페이지를 view 이름을 /test처럼 맵핑 할 수 있다.
->DispatcherServlet이 접수해서
Web.xml에서 servlet-context.xml으로 보낸다
이후
prefix, suffix를 붙여서 WEF-INF/views/ 와  ~.jsp를 붙여서 반환

WEB-INF/views/에 jsp 뷰페이지를 만들면 
그럼 맵핑된 multiweb/test에서 해당 jsp페이지를 볼 수 있다.






/////// 컨트롤러  생성 방법 ////////
1.src/main/java에 com.memo.controller 패키지 안에 컨트롤러 생성

2.MemoController 클래스 생성후
위에  @Controller 어노테이션추가

3.클래스폼에  @RequestMapping(value="/memo", method=RequestMethod.GET)
로 url맵핑,

4.jsp 뷰페이지는 반환값  return "memo/input";

5. WEB-INF/views/memo 폴더만들고
input.jsp 뷰페이지 생성

6. 이래도 패키지 스캔대상 등록을 하지 않아서 페이지를 못찾는데
WEB-INF/spring/appServlet/ servlet-context.xml에서 추가한 contoller 패키지를 추가해줘야 한다.
<context:component-scan base-package="com.memo.controller" />









////////////// 서버 설정 //////////////

1. VO에서 Setter Getter 등은 lombok.jar를 설치해서
https://projectlombok.org/download

 어노테이션 @Setter @Getter @ToString(includeFieldNames = true) 등으로 자동 생성 된다   --->outline에서 확인 가능


2. DAO는 인터페이스로 생성 -> DAOMyBatis로 상속받아 세부 구현할것이다. MyBatis를 사용하지 않는 경우 수정이 용이하도록..



3. web.xml에서 Config관련 파일들을 몰아두려 한다
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
<!-- /WEB-INF/spring/root-context.xml -->
classpath:config/spring/*-context.xml    <<<<<<<------ 이경로로
</param-value>
</context-param>


4. resource/config폴더에 모든것들을 몰아둔다.
 +/mybatis/
 +/props/
 +/spring/
 +/SQL/
 각 폴더를 생성한다. 해당 폴더마다 각 기능들 설정 파일들이 들어가게 된다.

5. ~/props/database.properties 파일에 
JDBC 드라이버, 계정 정보가 들어간다. MySQL은 주석으로 참고..
Global.DbType=oracle
Global.DriverClassName=oracle.jdbc.driver.OracleDriver
Global.Url=jdbc:oracle:thin:@localhost:49161:XE
Global.Username=multi
Global.Password=tiger

#Global.DbType=mysql
#Global.DriverClassName=com.mysql.jdbc.Driver
#Global.Url=jdbc:mysql://localhost:1433/tis_SHOP
#Global.Username=tis_shop
#Global.Password=tiger


6. 위와 같이  DB정보를 데이터 소스에 읽을 수 있도록 해야 한다.
~/spring/datasource-context.xml 을 spring config 파일로 생성할때
위 파일 경로 네임 스페이스는 beans,context,mybatis-spring 을 선택해서 생성한다.


7. datasource-context.xml에서 
[1] context, mybatis-spring 네임 스페이스 추가
[2] DataSource alias 별칭 주기. ---[1],[2]는 필수는 아니지만 [3],[4] 값을 직접입력해야됨 
[3] DataSource 빈 등록 (DBCP, HikariCP)
[4] SqlSessionFactoryBean 빈 등록
[5] SqlSessionTemplate 빈 등록

8. resources/config/mybatis/mybatis-config.xml 생성, Doctype선언문 복붙해야함.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">

9.  <!-- typeAlias 타입 별칭 설정 -->
<!-- mapper 정의  -->

10. resources/config/mybatis/mapper/MemoMapper.xml 생성, Doctype선언문 복붙해야함.

<mapper namespace="com.memo.model.MemoMapper">
<select id="getTotalCount" resultType="int">
select count(idx) from scott.memo
</select>
</mapper>

서버 실행해서 작동하는지 확인.



///////// DAOMybatis에서 ///////
1. 영속성 계층 DAO는 @Repository를 붙인다
   - //id가 sqlSessionTemplate인 객체[datasource-context.xml]을 찾아서 주입한다.
   주입을 통해서 session.selectOne(NS+".getTotalCount") 이런 마이바티스 기능을 쓰게 된다.

2. @Repository를 쓰려면 WEB-INF/spring/appServlet/servlet-context.xml 에 해당 패키지
com.memo.model 를 스캔하도록  <context:component-scan base-package="com.memo.model" />
가 추가되어야 한다.




///////// ///////// ///////// 기능 추가 할때 순서. ///////// ///////// ///////// 
[1] Controller로 들어간다

[2] @RequestMapping(value="/memoEdit", method=RequestMethod.POST)
어떤 페이지에서 시작하는지,   POST인지 GET인지 지정

[3] public String memoDelete(Model model, @RequestParam(defaultValue = "0") int idx) {
어떤 기능인지, ( 모델은 기본으로 부른다, 받아야 되는것이 1개면 @RequestParam, 다수이면 @ModelAttribute("memo") MemoVO memo 자체를 받는다.

[3-1] 리다이렉트가 필요한 경우 
if(idx==0) {
return "redirect:memoList"; //redirect 시키는
}
[4] 메시지 출력과 이동 경로 지정, 
int n = memoDao.updateMemo(memo);
String str = (n > 0) ? "수정 성공" : "수정 실패";
String loc = (n > 0) ? "memoList" : "javascript:history.back()";

  model.addAttribute("message", str);
model.addAttribute("loc", loc);

[5] 해당 메서드의 최종 경로는 이곳이고
  return "msg";
loc에 지정되는 것에 따라 msg.jsp에서 경로를 재설정하는 방식이다.






****************************************************************
전체 흐름도 해석

1. web.xml에서
classpath.config/spring/*-context.xml 위치를 지정
이렇게 지정한 파일들은 실행 할 때 메모리에 우선적으로 올린다.

그아래 리스너가 위 경로를 우선적으로 실행하도록 명령한다.

그아래 DispatcherServlet이 모든 요청을 받아낸다.

한글 인코딩 처리도 이곳에서 지정한다.

2. servlet-context.xml 에서 
ViewResolver로 뷰페이지 방식 설정 - 이것이 접두어 경로,접미어.jsp로 url을 지정한다
메모리에 올릴 패키지를 등록

2. spring/datasource-context.xml 에서
db유형, 계정명 등 경로 지정 props

Datasource 빈등록이 DBUtil.con()같이 연결 얻어오고 마지막에 close()메서드 하는 역할.
---오라클세팅

MyBatis 세팅에서
SqlSessionFactory를 등록
SqlSessionTemplate를 통해서 SqlSession을 얻어 올 수 있다.

****************************************************************




/*아이디 중복체크 ajax처리 -- 별도로 관리해야되는데 적어서 일단 여기서 작성.
 * 스프링에서 JSON데이터를 생성해야 하는 경우. 
 * [1] pom.xml에 Jackson Databind 등이 임포트되야 한다.
 *  <dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.8</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.dataformat/jackson-dataformat-yaml -->
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-yaml</artifactId>
<version>2.9.8</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
 *
 * [2] @ResponseBody 를 붙여주고 반환 자료 유형을 Map또는 VO유형으로 하면 위 라이브러리 들이 json형태로 변환된다.
 *  
 * [3] 매핑된 idcheck .jsp를 찾아가는게 아니라 응답 유형이 json이라면 
 *  @GetMapping에 produces="application/json" 기술하자. */




셋팅 이후 기능 추가 순서 문서봐야 할 순서
뷰페이지 시작지점

컨트롤러(뷰맵핑)
[Impl]서비스임플(이동방식,경로지정)
[Impl]DAOMyBatis(세션)
맵퍼(SQL문) 

뷰페이지 임포트