๋ฉ‹์‚ฌ Backend Plus 12์ผ์ฐจ ๐Ÿฆ

์‹ ์žฌ์›ยท2023๋…„ 11์›” 8์ผ

์˜ค๋Š˜ ํ•˜๋ฃจ๋™์•ˆ mybatis ํŒ€ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๋ฐฐ์› ๋˜ ์ ๊ณผ ๋А๊ผˆ๋˜ ์ ์„ ์ž‘์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

mybatis ๊ด€๋ จ ์ž๋ฃŒ๋„ ๋ถ€์กฑํ•˜์˜€๊ณ , ์ด์ „ ๋ฉ‹์‚ฌ ์ž๋ฐ” ์Šคํ”„๋ง ๊ณผ์ •์—์„œ๋Š” JPA๋ฅผ ์‚ฌ์šฉํ–ˆ๊ธฐ๋–„๋ฌธ์— ์–ด์ƒ‰ํ–ˆ๋˜ ๊ฒƒ ๋„ ์žˆ๋Š”๊ฒƒ ๊ฐ™์•˜๋‹ค.

๋‚˜๋Š” Session(์„ธ์…˜)์„ ํ†ตํ•œ ๋กœ๊ทธ์ธ ํšŒ์›๊ฐ€์ž… ํŒŒํŠธ๋ฅผ ๋งก์•˜์œผ๋ฉฐ, ์„ธ์…˜์„ ํ†ตํ•œ ๋กœ๊ทธ์ธ ํšŒ์›๊ฐ€์ž…์€ ์ฒ˜์Œ ์‹œ๋„ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด์˜€๋‹ค. (Jwt ๋ฐฉ์‹์œผ๋กœ๋Š” ํ•ด๋ณธ์  ์žˆ์Œ)


JWT ์™€ Session ๊ธฐ๋ฐ˜ ์ธ์ฆ์˜ ์ฐจ์ด๋ฅผ ๋จผ์ € ์†Œ๊ฐœํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

  • JWT ๋ž€ "Json Web Token" ์˜ ์•ฝ์ž๋กœ Json ๊ฐ์ฒด์— ์‚ฌ์šฉ์ž์˜ ์ •๋ณด ์ผ๋ถ€๋ฅผ ๋‹ด์Šต๋‹ˆ๋‹ค. โžก ์„ธ์…˜ ๋กœ๊ทธ์ธ์˜ ๋Œ€์ฒด์žฌ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ „ํ†ต์ ์ธ ๋ฐฉ์‹์ธ ์„ธ์…˜์˜ ๋กœ๊ทธ์ธ ๋ฐฉ์‹์˜ ๊ณผ์ •์„ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

HTTP ํ”„๋กœํ† ์ฝœ์˜ ๋ฌด์ƒํƒœ์„ฑ ํŠน์ง• ๋•Œ๋ฌธ์— ์„œ๋ฒ„์™€ ํ†ต์‹ ์ด ๋๋‚˜์ž๋งˆ์ž ์ •๋ณด ์ฆ‰ ์ƒํƒœ๋ฅผ ์žŠ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. โžก ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ• ๋•Œ๋งˆ๋‹ค ๋กœ๊ทธ์ธ ์ฐฝ์ด ๊ณ„์† ๋œจ๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์„ธ์…˜ ๋กœ๊ทธ์ธ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์„ธ์…˜ ๋กœ๊ทธ์ธ ๋ฐฉ์‹์˜ ๋ฌธ์ œ์ ์ด ๋ญ˜๊นŒ?

์„ธ์…˜์€ ๋ฉ”๋ชจ๋ฆฌ ๋‚ด๋ถ€์— ์ ์žฌ๋˜์–ด ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
์ฆ‰ ์„œ๋น„์Šค ์ด์šฉ์ž๊ฐ€ ๋งŽ์•„์ง€๋ฉด ์„ธ์…˜์˜ ์–‘์ด ๋งŽ์•„์ง„๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ ๊ณผ๋ถ€ํ•˜๊ฐ€ ๊ฑธ๋ฆฌ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

  • ์ถ”๊ฐ€๋กœ ๋งŒ์•ฝ ์„ธ์…˜ ๋กœ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด, ์„ธ์…˜์˜ ์–‘์ด ๋งŽ์•„์ ธ ์„œ๋ฒ„๋ฅผ ๋ถ„์‚ฐํ•ด์•ผ ํ•œ๋‹ค๋ฉด, ์„ธ์…˜์„ ๋ถ„์‚ฐ์‹œํ‚ค๋Š” ๊ธฐ์ˆ ์„ ๋”ฐ๋กœ ์„ค๊ณ„ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

mybatis ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ Spring Data Jpa์—์„œ๋Š” ๊ฐ„๋‹จํžˆ save() ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ• ์ˆ˜ ์žˆ์—ˆ๋Š”๋ฐ, mybatis ๋Š” ์ง์ ‘ ๋งคํ•‘์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ SQL ์ฟผ๋ฆฌ๋ฌธ์„ ์„ค์ •ํ•œ ๊ฒฝ๋กœ์˜ xml ํŒŒ์ผ์— ์ž‘์„ฑํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜์™€ ๊ฐ™์ด yml ํ˜น์€ properties ์—์„œ ๊ฒฝ๋กœ๋ฅผ ์„ค์ •์„ ํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

mybatis:
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: com.project.readers.entity
  configuration:
    map-underscore-to-camel-case: true

์ฒซ๋ฒˆ์งธ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๋งคํ•‘ํ•  DAO ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ๊ฒ ์Šต๋‹ˆ๋‹ค.

@Mapper
public interface UserDAO {
	// ๋“ฑ๋ก (ํšŒ์›๊ฐ€์ž…)
    void register(UserDTO userDTO);

	// ๋กœ๊ทธ์ธ
    UserSessionDTO login(UserDTO userDTO);

	// ์ˆ˜์ •
    void update(UserDTO userDTO);

	// ์‚ญ์ œ
    void delete(int idNum);
}

์ธํ„ฐํŽ˜์ด์Šค์—์„œ ๋ฉ”์†Œ๋“œ๋ฅผ ๋งŒ๋“ค๊ฒŒ ๋˜๋ฉด ๊ผญ xml ํŒŒ์ผ์—์„œ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค !!!
์ถ”๊ฐ€๋กœ ํ•ด๋‹น ๋ฉ”์†Œ๋“œ ์ด๋ฆ„์€ xml ํŒŒ์ผ์—์„œ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•œ ํ‚ค ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋‘๋ฒˆ์งธ๋กœ ์„ธ์…˜๋กœ๊ทธ์ธ์„ ํ•˜๊ธฐ ์œ„ํ•œ HttpServletRequest ๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์Šต๋‹ˆ๋‹ค.

@PostMapping("/login")
    public String loginUser(UserDTO userDTO, HttpServletRequest request) {
    	// ์„ธ์…˜์„ ๋ฐ›์•„์˜จ๋‹ค.
        HttpSession session = request.getSession();

        UserSessionDTO loginUser = userService.loginUser(userDTO);
        
        String result = "";
        
        if (loginUser == null) {
            result = "๋กœ๊ทธ์ธ ์‹คํŒจ";
        } else {
        	// ์„ธ์…˜์— key, value ๊ฐ’์„ ํ• ๋‹น ํ•ฉ๋‹ˆ๋‹ค.
            session.setAttribute("id", loginUser.getId());
            session.setAttribute("roleNum", loginUser.getRoleNum());

            result = "๋กœ๊ทธ์ธ ์„ฑ๊ณต";
        }
        return result;
    }

์„ธ๋ฒˆ์งธ๋กœ xml ํŒŒ์ผ์—์„œ ์œ ์ €๋ฅผ ๋“ฑ๋ก (ํšŒ์›๊ฐ€์ž…) ํ•˜๊ธฐ์œ„ํ•œ SQL ์ฟผ๋ฆฌ๋ฌธ์„ ์ž‘์„ฑ ํ•ฉ๋‹ˆ๋‹ค.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!-- ๋งคํ•‘ํ•  DAO ์ธํ„ฐํŽ˜์ด์Šค -->
<mapper namespace="com.project.readers.repository.UserDAO">

  	<!-- DAO ์ธํ„ฐํŽ˜์ด์Šค์— ์žˆ๋Š” ๋ฉ”์†Œ๋“œ ๋ช…์ด id ๊ฐ’์œผ๋กœ ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค.-->
    <insert id="register" parameterType="UserDTO">
      
      <!-- ๋งŒ๋“  ํ…Œ์ด๋ธ”์˜ ํ•„๋“œ๋ช…์ด๋ž‘ ๋™์ผํ•ด์•ผ ํ•˜๋ฉฐ, 
					#{} ์•ˆ์˜ ๊ฐ’์€ DTO์˜ ํ•„๋“œ๋ช…๊ฐ€ ๋™์ผํ•ด์•ผํ•œ๋‹ค-->
        insert into tb_user(ID_NUM, ID, PW, NAME, EMAIL)
        values (TB_USER_SEQ.NEXTVAL, #{id}, #{pw}, #{name}, #{email})
    </insert>

    <select id="login" parameterType="UserDTO" resultType="UserSessionDTO">
        SELECT MEMBER.ID,
               ROLE.role_num
        FROM TB_USER MEMBER
                 INNER JOIN
             MP_USER_ROLE ROLE
             ON
                 MEMBER.ID = "ROLE".ID
        WHERE MEMBER.id = #{id}
          AND MEMBER.PW = #{pw}
    </select>

    <update id="update" parameterType="UserDTO">
        update tb_user
        set PW    = #{pw},
            NAME  = #{name},
            EMAIL = #{eamil}
        where ID_NUM = #{idNum}
    </update>

    <delete id="delete" parameterType="Integer">
        delete
        from tb_user
        where ID_NUM = #{idNum}
    </delete>
</mapper>

์ด๋ ‡๊ฒŒ ํ•ด์„œ ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ํ†ตํ•ด mybatis ๋ฅผ ์‚ฌ์šฉํ•ด๋ณด๋ฉด์„œ ์กฐ๊ธˆ์€ ์นœํ•ด์งˆ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€