동적SQL / Security

이동언·2024년 9월 5일

new world

목록 보기
40/62
post-thumbnail

9.5 (목)

1. resultMap

👉 기존에는 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;
}




3. MyBatis 동적쿼리

👉 sql 내부에 if-else / choose 와 같은 태그를 사용하여 동적으로 쿼리를 만들수있는것이 MyBatis의 장점중 한가지

3-1. pageRequset

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는 검색조건이다.

3-2. BoardMapper.xml

<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. spring-security

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 로그인창으로 튕겨버림

0개의 댓글