👉 기존에는 xml코드 내부에 select 태그와 함께 id와 resultType을 많이 사용했지만, resultMap을 통해 mapping을 쉽게 할 수 있다. 예를들어
xml내부 sql코드의 결과와 DTO인 JAVA객체를 매핑시키기 위해서이다.
👉 우선 resultMap을 사용해야하는 이유는 DTO에서 fileNames의 List때문인것 같다.
<resultMap id="readMap" type="BoardReadDTO">
// readMap이라는 이름으로 BoardReadDTO와 매핑
<id property="bno" column="bno"></id>
// DTO의 bno값과 sql의 bno값을 매핑하는데, bno는 pk이므로 id
<result property="title" column="title"></result>
// DTO의 title값과 sql의 title값을 매핑하는데, result는 그냥 일반 데이터
<collection property="fileNames" resultMap="fileNameMap"></collection>
// DTO의 fileNames와 아래 resultMap의 fileNameMap을 매핑
collection은 list와 같은 다대다 관계
</resultMap>
<resultMap id="fileNameMap" type="string">
<result column="fileName"></result>
</resultMap>
<select id="select" resultMap="readMap">
select
b.bno, b.title, b.content, b.writer, b.regDate,
b.modDate, a.fileName
from tbl_board b left join tbl_board_attach a on a.bno = b.bno
where a.bno = #{bno}
order by a.ord asc
</select>
package org.zerock.w2.dto;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.List;
@Data
public class BoardReadDTO {
private Long bno;
private String title;
private String content;
private String writer;
private LocalDateTime regDate;
private LocalDateTime modDate;
private List<String> fileNames;
}
👉 sql 내부에 if-else / choose 와 같은 태그를 사용하여 동적으로 쿼리를 만들수있는것이 MyBatis의 장점중 한가지
package org.zerock.w2.vo;
import lombok.Getter;
import lombok.ToString;
@Getter
@ToString
public class PageRequest {
private int page = 1;
private int size = 10;
private String type;
private String keyword;
public void setType(final String type) {
this.type = type;
}
public void setKeyword(final String keyword) {
this.keyword = keyword;
}
public String[] getArr() {
if(type == null || keyword == null || keyword.trim().length() == 0) { //검색조건이 없을경우
return new String[0];
}
return type.split("");
}
public void setPage(int page) {
this.page = page <= 0 ? 1 : page;
}
public void setSize(int size) {
this.size = size <= 10 ? 10 : size >= 100 ? 100: size ;
}
public int getSkip() {
return (this.page - 1) * 10;
}
}
👉 pageRequest에서 검색에 필요한 type, keyword를 정의한다. 여기서 type은 TCW로 title, content, writer별로 나뉘고 keyword는 검색조건이다.
<sql id="search">
<foreach item="type" collection="arr" open="AND (" close=")" separator="OR"> <!--separator는 중간중간 OR-->
<if test='type.equals("T")'>
title like concat('%', #{keyword}, '%')
</if>
<if test='type.equals("C")'>
content like concat('%', #{keyword}, '%')
</if>
<if test='type.equals("W")'>
writer like concat('%', #{keyword}, '%')
</if>
</foreach>
</sql>
👉 xml의 sql코드를 이용하여 조건에 맞는 type과 keyword를 통해 검색하도록 만든다.
👉 이후 주소창에는
(http://localhost:8080/board/list?page=3&type=W&keyword=user5)
이렇게 검색한다면, 3page에서, Writer가 user5인 사람들의 글만 보이도록 된다.
4-1. maven
implementation 'org.springframework.security:spring-security-core:5.7.8'
implementation 'org.springframework.security:spring-security-config:5.7.8'
implementation 'org.springframework.security:spring-security-taglibs:5.7.8'
implementation 'org.springframework.security:spring-security-web:5.7.8'
4-2. web.xml 코드 추가 / context-param은 기존에 있던 코드에서 security부분만 추가
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring/root-context.xml
/WEB-INF/spring/security-config.xml
</param-value>
</context-param>
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
4-3. security-config.xml 생성
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:security="http://www.springframework.org/schema/security"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/security https://www.springframework.org/schema/security/spring-security.xsd">
<security:http>
<security:form-login></security:form-login>
</security:http>
<security:authentication-manager>
</security:authentication-manager>
</beans>
4-4. security-config 수정
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:security="http://www.springframework.org/schema/security"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/security https://www.springframework.org/schema/security/spring-security.xsd">
<security:http>
<security:form-login></security:form-login>
<security:intercept-url
pattern="/sample/member"
access="hasRole('ROLE_MEMBER')"/>
</security:http>
<security:authentication-manager>
</security:authentication-manager>
</beans>
4-5.


👉 간단하게 jsp controller 만들어놓고, 주소창에서 (http://localhost:8080/sample/member)로 들어가게 되면

👉 security 로그인창으로 튕겨버림