Spring

[Spring]3. Spring Legacy 템플릿

CodeJaram 2023. 9. 11. 13:34

Spring_03_Spring Legacy 템플릿

 

[Spring 템플릿 사용하기]

  • spring 프로젝트 만들기: new-other-Spring Legacy Project

  • controller 패키지 만들기: kr.board.[controller]→ [ ] context path

 

[context root 변경]Web Project Settings

 

[web.xml]java-→Java로 변경



[Spring 디렉토리 구조]

 

[서버 등록]

  1. 프로젝트를 서버탭으로 드래그앤드롭

 

 

2. 톰캣 modules에서 프로젝트 등록

 

[spring 환경설정] 1~25번

 

[pom.xml]

S1. Spring version: 5.0.2 버전으로 변경, java version: 1.8 버전으로 변경

 

S2. JDK version:  1.8 버전으로 변경

 

S3. 기본 Dependency 추가: Mybatis, lombok

 

[package 구조]

  • controller: POJO

-업무단위별로 Controller 

  • entity: DTO와 같은 역할, 테이블 간의 관계
  • mapper:DB에 연결하는 객체(Connection, sqlSession) 필요없이 내부 API로  DB와 연결하기 때문에 Mapping만 함

 

[controller-BoardController]업무단위별 Controller 통합

S4. Controller 생성: Controller들을 통합하여 업무단위별로 Controller로 생성

예)BoardController, MemberController

 

[entity-Board]DTO 역할

S5. entity 생성

  • 버전이 높을수록 객체와 테이블 간의 관계를 맺기 때문에 class명은 테이블명과 똑같이 생성
  • Board 객체에 필요한 필드 작성, lombok으로 전체 생성자와 기본생성자 만들기

[mapper-BoardMapper.java]DAO 역할

S6. DB와 연결하는 인터페이스 생성: BoardDAO와 같은 역할

 

※DAO 메소드 내부 코드(DB 연결객체)는 Spring 내부 API로 진행하므로 추상메소드로 생성

 

[mapper-BoardMapper.xml]BoardMapper 인터페이스를 찾는 역할(namespace)

S7. Mapper 생성

※mapper 파일 생성: mapper- “인터페이스 파일명과 동일한 파일이름”

 

[controller-BoardController]

  • annotation 방식으로 Controller 역할을 하는 class임을 명시

 S9.  HandlerMapping: annotation 방식으로 RequestMapping 작성(“HashMap Key”)

 

S10. 기능별 Controller은 메소드로 변환: 이동할 페이지 viewname 리턴

 

[jsp 파일]

  • 링크 경로에 resources 추가

 

 

[WEB Layer] Frontcontroller, HandlerMapping, ViewResolver 설정

1) Frontcontroller: DispatcherServlet이 [servlet-context.xml]파일을 통해 Controller들을 찾아서 객체 생성

 

2)HandlerMapping: DispatcherServlet이  HandlerAdapter를 통해 이동할 Controller 실행

(console창)

 

3)ViewResolver : DispatcherServlet이 HandlerAdator을 통해 실행한 Controller에서 return한 viewname을 ViewResolver에 반환→완전한 주소로 생성



[web.xml]

S11. FrontController(DispatcherServlet) 생성

  • Tomcat이 start되면 제일 먼저 web.xml을 읽음
  • Spring Container: Tomcat 실행 시 가장 먼저 생성되어  bean(객체) 생성, 관리, 삭제하는 메모리 공간
  • DispatcherServlet: Front Controller와 같은 역할, [servlet-context.xml]파일을 읽고 POJO로 연결시킴

 

 

[servlet-context.xml]

 

S12. base-package scan: Controller들을 scan하는 작업

S13. ViewResolver

  • <bean>: xml 파일에서 객체를 의미하며, 객체를 생성하는 태그
  • InternalResourceViewResolver: 가장 많이 사용되는 ViewResolver

 

4)객체 바인딩: DB의 정보를 view에서 받기 위해 Model에 객체 바인딩(request과 같은 기능)

  • 데이터 객체바인딩: model.addAttribute(이름, 데이터)
  • 데이터 가져오기: request.getAttribute(이름), ${ }



[BoardController]

 S14. Model에 객체 바인딩

  • 매개 변수에 Model 받아오기(객체바인딩에 쓰는 객체)

  • Board(entity)에 저장할 데이터 추가하여 ArrayList에 저장

  • model에 ArrayList(board_list) 객체 바인딩

[BoardMain]

  • EL 표현식으로 request 객체에서 저장한 데이터(board_list) 받아오기

 

[Persistence Layer]DB 연동 및 SQL문장 Mapper

1)DB 연동: HikariCP가 DB와 연동하는 역할

 

[web.xml]

 S15. ContextLoaderListener

  • DB 연결하는 객체 
  •  Spring Container에 가장 먼저 만들어지는 객체
  •  root-context.xml에 DB 관련 환경설정하고
  • 해당 파일을 읽어서 DB 연결 진행

 

[root-context.xml]

S16. root-context.xml: DB 연동 관련 환경설정하는 xml 파일

<db.properties>

-JDBC: Connection, PrepareStatement

-mybatis:  sqlSessionFactory

 

<Spring>

-DB 연결: Spring Framework API(Hikari CP)가 담당

-SQL Mapping: mybatis가 담당

 

S17. HikariCP

  • Spring과 mybatis의 역할이 중복되므로 역할 분리
  • DB 연결 부분→Spring에서 HikariCP가 담당(overhead가 적은 성능이 좋은 cp api)
  • sql Mapping→mybatis가 담당

 

  • DB에 연결하기 위해 HikariCP에서 필요한 class

    1)HikariConfig: DB 접속정보를 가진 class

    2)HikariDataSource: DB 접속정보를 바탕으로 Connection Pool을 만들어줄 class

 

[pom.xml]

S18. HikariCP 설치: maven repository에서 Hikaricp(4.0.3) 가져오기

[root-context.xml]

<bean> 태그 사용법: setter 

  • 객체 호출: <bean id=”사용할 클래스이름” , class=”불러올 클래스 경로”>
  • 속성값 추가: <property name=”속성이름”, value=”속성에 추가할 값”>

 

 

S19-1. HikariConfig: DB 접속정보(driver, url) 등을 가지고 있는 class

  • hikariConfig class 추가하기

-class 경로: Maven Depndencies에서 Copy Qualified name으로 경로복사

- id: 클래스이름을 소문자로 기입

 

 

  • url 속성: jdbcUrl
  • username, password 속성: C:\eGovFrame-4.0.0\bin 폴더 'mysql 참고' 파일

[실습용 공통 컴포넌트] id, pw 입력

 

 

<bean> 태그 사용법: 생성자

  • 클래스 및 생성자 호출: <bean id=”class/생성자명”, “class/생성자 경로”>
  • 생성자 주입: <constructor-arg ref=”사용할 생성자명”>

 

S19-2.HikariDataSource: DB 접속정보(HikariConfig)를 가지고 Connection Pool 생성하는 class

 

2)Mapper

[BoardMapper]

S20. 추상메소드 만들기

  • annotation 방식으로 mapper 역할을 하는 class임을 명시

 

  • DAO 내부메소드(sql 문장실행기능)를 추상메소드로 만들기

-interface에서 필요한 구현클래스를 만드는 sqlSessionFactoryBean 객체가 있으므로 내부코드가 필요없음

 

[root-context]

S21. Mapper 역할 class 메모리 등록

 

  • root-context Namespace: mybatis-spring 등록

 

[pom.xml]

S22. DB 관련 API 추가

 

[root-context]

S23.sqlSessionFactoryBean 생성: mapper의 인터페이스가 필요한 구현클래스(DB 연결) 생성

  • Connection Pool을 만드는 HikariDataSource를 참조하여 DB연결

 

[BoardMapper.xml]

S24-1. xml 파일에 sql문장 작성

 

[BoardMapper.java]

S24-2. annotation 방식으로 sql문장 작성

 

[Web Layer+Persistence Layer]Controller와 Mapper 연결하여 DB 데이터 전송

 

[Mysql 연결 및 테이블 생성]

  1. mysql 서버 구동: C:\eGovFrame-4.0.0\bin\mysql-5.7.32 [startup] 클릭

*mysql  구동 오류 해결: vcredist_x64.exe 다운로드 및 실행

 https://www.microsoft.com/ko-KR/download/details.aspx?id=40784



2. Data Source Explorer: DB-eclipse 연동하는 역할

 

  • properties-Driver Properties 확인

 

3. DB 연결: com 더블클릭

 

[mysql.sql]

4. sql scrapbook 열기: 오른쪽 마우스-Open SQL Scrapbook

 

5. Scrapbook DB 연결: Type(MySql_5.1), Name(com), Database(com) 선택


 

6. 테이블 생성

  • 테이블명은 entity 클래스명과 동일하게 작성
  • 컬럼은 [Board]에서 작성한 필드명과 타입과 동일하게 생성

 

 

*문장실행: 문장 블럭 씌운 후 Alt+X

 

*저장: Ctrl+S-저장할 프로젝트 선택(SpringMVC1)

 

**sqlDeveloper에서 Mysql 연결하기  https://reference-m1.tistory.com/122

 

 

[BoardController]

S25. Autowired로 BoardMapper 선언(BoardController↔Mapper): DAO와 Controller 연결

  • Autowired: Spring Container에 이미 만들어진 객체를 가져와 의존성 주입

 

[기능별 메소드 만들기]

[BoardController]

  1. BoardMain 첫화면으로 만들기
  • 주소가 “/” 일 때 Redirect 방식으로 boardList 호출하기

- boardList(게시글 전체 조회메소드)가 실행되어 boardMain으로 이동하게 됨 

 

■Mapping의 종류(HandlerMapping 역할)

  • RequestMapping: GET/POST 방식 상관없이 요청받는 방법
  • GetMapping: GET 방식으로 요청받는 방법
  • PostMapping: POST 방식으로 요청받는 방법

 

 

2. 게시글 작성화면으로 페이지로 이동하기: BoardWrite 리턴하기

 

3. 작성한 게시글 DB에 저장하기

[BoardController]

  • 매개변수에 Board(DTO) 받아오기
  • Autowired로 선언한 Mapper의 boardInsert 메소드에 board 넣기
  • redirect 방식으로 boardList로 이동하기: 작성한 게시글 반영해서 출력

 

[BoardMapper]

  • annotaion 방식으로 insert sql문장 작성
  • boardInsert 메소드 추상메소드로 만들기

 

4. 게시글 세부정보 조회 메소드

[BoardController]

  • BoardMain에서 보낸 게시글 번호 원하는 이름으로 받기

-@RequestParam(“전송한 변수명”) 원하는 변수명

  • 게시글 번호에 해당하는 게시글 조회: boardMapper의 getDetail에 게시글번호 넣기
  • 게시글 조회한 결과 model에 객체 바인딩하기
  • boardDetail 페이지로 이동하기

 

[BoardMapper]

  • annotaion 방식으로 select sql문장 작성
  • getDetail 메소드 추상메소드로 만들기

5. 게시글 삭제하는 메소드: 전송한 변수명과 상관없이 원하는 변수명으로 받아오기

 

[BoardMain]

  • 값을 보낼 주소/${전송할 값 변수명}

 

[BoardController]

  • 원하는 변수명으로 받기

-RequestMapping: ("/요청 주소/{전송받은 변수명}")

-매개변수: @PathVariable 전송받은 변수명, @PathVariable 전송받은 변수명2

 

 

[web.xml]

S26. 한글 인코딩: request가 DispatcherServlet(FrontController)로 전송되기 전 한글인코딩

 

[Spring 전체 구조]

 

'Spring' 카테고리의 다른 글

[Spring]6. Spring Boot&React 연동  (0) 2023.09.20
[Spring]5. Spring Boot  (0) 2023.09.15
[Spring]4. Ajax 비동기 통신  (0) 2023.09.14
[Spring]2. 게시판 조회 및 삭제 실습  (0) 2023.09.09
[Spring]1. Spring 개요  (0) 2023.09.06