공부잡동사니

스프링 검색 기능 추가 본문

개발/스프링 웹

스프링 검색 기능 추가

공부잡상인 2025. 4. 18. 21:08

스프링 MVC를 이용하는 웹 프로젝트 전체 구조에 대한 이해

개발의 각 단계에 필요한 설정 및 테스트 환경

기본적인 등록, 수정, 삭제, 조회, 리스트 구현

목록(리스트) 화면의 페이징(paging) 처리

검색 처리와 페이지 이동 

각 영역의 네이밍 규칙

-xxxController: 스프링 MVC에서 동작하는 Controller 클래스

-xxxSerivce, xxxServiceImpl: 비즈니스 영역을 담당하는 인터페이스는 ‘xxxService’라는 방식을 사용하고, 인터페이스를 구현한 클래스는 ‘xxxServiceImpl’이라는 이름을 사용

 

-xxxDAO, xxxRepository: DAO(Data-Access-Object) Repository(저장소)라는 이름으로 영역을 따로 구성하는 것이 보편적. 예제에서는 별도의 DAO를 구성하는 대신에 MyBatis Mapper 인터페이스를 활용.

 

-VO, DTO: VO의 경우는 주로 Read Only의 목적이 강하고, 데이터 자체도 Immutable(불변)하게 설계. DTO는 주로 데이터 수집의 용도

 

프로젝트 패키지의 구성

프로젝트의 생성및 준비

-Spring Legacy Project의 생성

-pom.xml에서 스프링 버전 변경

-spring-test,spring-jdbc,spring-tx 추가

-junit버전 변경

-Servlet 버전 변경 

-HikariCP, MyBatis, mybatis-spring, Log4jdbc 추가

-JDBC드라이버 프로젝트내 추가

-기타 Lombok의 설정 등

Dummy(더미) 데이터의 추가

insert into tbl_board (bno, title, content, writer)

values (seq_board.nextval, '테스트 제목','테스트 내용','user00');

반복적인 실행으로 여러 개의 데이터 생성 및 확인 및 commit   

데이터베이스 설정 및 테스트

root-context.xml

DataSource의 설정

SqlSessionFactory 설정

영속 계층 구현  

영속 계층의 처리

-테이블 반영하는 VO(Value Object) 클래스의 생성

-MyBatis Mapper 인터페이스의 작성/XML 처리

-작성한 Mapper 인터페이스의 테스트

 

BoardVO 클래스

Mapper인터페이스 

BoardMapper의 테스트

Mapper XML파일

게시물 등록(Create)

-생성된 게시물의 번호를 사용하는지에 따른 구분

-insert만 처리되고 생성된 PK 값을 알 필요가 없는 경우

-insert문이 실행되고, 생성된 PK 값을 알아야 하는 경우

-<selectkey> 사용

BoardMapper.xml

<selectkey>

-SQL이 실행되기 전에 별도의 PK값등을 얻기 위해서 사용

-order=‘before’ 를 이용해서 insert구문이 실행되기 전에 호출

-keyProperty를 통해 BoardVO bno값으로 세팅

게시물의 조회(read)

-BoardMapper read관련 메서드의 추가

-BoardMapper.xml SQL 추가

-테스트를 통한 확인

게시물의 삭제

-BoardMapper인터페이스에 메서드 추가  파라미터는 PK

-BoardMapper.xml의 수정

@Service 어노테이션

-@Service는 스프링에 빈으로 등록되는 서비스객체의 어노테이션

-XML의 경우에는 <component-scan>에서 조사하는 패키지의 클래스들 중에 @Service가 있는 클래스의 인스턴스를 스프링의 빈으로 설정

 

서비스 계층의 구현과 테스트 진행

-원칙적으로는 서비스 계층 역시 Mapper DAO와 같이 별도로 테스트를 진행하는 것이 바람직

-하나의 Mapper DAO를 이용하는 경우에는 테스트를 생략하는 경우도 많은 편

 

웹 계층의 구현

-웹 계층에서 가장 먼저 설계하는 것은 URI의 설계

진행 작업의 순서

-목록 페이지  -  모든 진입 경로인 동시에 입력을 가는 링크

-등록 입력/처리  게시물 등록 및 처리, 처리후 이동

-조회  목록 페이지에서 특정 게시물로 이동

-수정/삭제  조회 페이지에서 수정/삭제 선택해 처리

 

BoardController 목록의 처리

-게시물(BoardVO)의 목록을 Model에 담아서 전달

BoardController의 등록 처리

-POST방식으로 처리되는 데이터를 BoardVO 타입의 인스턴스로 바인딩해서 메서드에서 활용

-BoardService를 이용해서 등록 처리

-‘redirect: ‘를 이용해서 다시 목록으로 이동

 

등록처리의 테스트

BoardController의 조회/테스트

BoardController의 수정/테스트

BoardController의 삭제/테스트

목록 페이지 작성

-프로젝트의 경로는 ‘/’ 이용하도록 수정

-Tomcat등을 이용해서 실제로 JSP 처리에 문제 없는지 확인후 진행

includes 적용

-JSP페이지의 공통으로 사용되는 페이지의 일부를 header.jsp footer.jsp로 분리해서 각 페이지에서 include 하는 방식으로 사용

 

 

list.jsp의 적용

목록 화면의 처리

등록 입력 페이지와 등록

-GET방식으로 게시물 등록 화면 제공

-POST방식으로 실제 게시물 등록 처리

-이후 목록 페이지로 이동

참고

한글 깨짐과 필터 설정

UTF-8 필터 처리

web.xml을 이용한 필터 설정

게시물 작업 이후 재전송

-게시물의 등록, 수정, 삭제의 경우에 해당

-작업이 완료된 후에는 리스트 페이지로 다시 이동

-BoardController에서는 RedirectAttributes addFlashAttribute( )를 이용해서 단 한번만 전송되는 데이터 저장후 전송

-JSP등의 화면에서는 JavaScript를 이용해서 경고창이나 모달창등을 보여주는 형식

화면의 처리

작업후 생성되는 결과

일반 호출의 결과

모달창 보여주기

-BoardController에서 특정한 데이터가 RedirectAttribute에 포함된 경우에 모달창을 보여주기

조회 페이지와 이동

-목록에서 특정 게시물 선택후 이동 처리

-조회의 경우는 반드시 GET방식으로만 처리 

뒤로 가기와 windo history객체

게시물의 수정/삭제 처리

검색의 유형

-제목, 내용, 작성자와 같은 단일 항목

-제목 + 내용, 제목 + 작성자와 같은 복합 항목

-검색 항목에 따라서 매번 다른 SQL이 처리될 필요가 있는 상황

-MyBatis의 동적쿼리기능을 이용해서 처리

http://www.mybatis.org/mybatis-3/ko/dynamic-sql.html

MyBatis의 동적 태그들

-if

-if  test라는 속성과 함께 특정한 조건이 true가 되었을 때 포함된 SQL을 사용하고자 할 때 작성

-choose (when, otherwise)

-if와 달리 choose는 여러 상황들 중 하나의 상황에서만 동작

-trim (where, set)

-trim, where, set은 단독으로 사용되지 않고, <if>, <choose>와 같은 태그들을 내포하여 SQL들을 연결해 주고, 앞 뒤에 필요한 구문들(AND, OR, WHERE )을 추가하거나 생략하는 역할

-foreach

-foreach List, 배열, 맵 등을 이용해서 루프를 처리

foreach태그

검색조건처리를 위한 Criteria클래스 변경

검색항목(type)과 검색 키워드(keyword)추가

BoardMapper.xml의 변경

<sql>조각과 <include>

-게시물의 검색과 게시물의 숫자 카운트에 공통으로 사용되므로 <sql>조각으로 분리하고, 필요한 곳에서 <include>하는 방식으로 적용

화면에서의 검색처리

검색이벤트 처리 검색이벤트 처리

검색후 <select> 처리

-‘Search’를 클릭하면 무조건 1페이지로

-이후에는 검색 항목 유지

ex02_0521.zip
1.52MB

'개발 > 스프링 웹' 카테고리의 다른 글

스프링  (0) 2025.04.18
스프링,오라클 DB 페이지 처리  (0) 2025.04.18
스프링  (0) 2025.04.18
스프핑 페이지 연결  (0) 2025.04.18
spring  (0) 2025.04.18