์ค๋ ํ๋ฃจ๋์ mybatis ํ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ๋ฐฐ์ ๋ ์ ๊ณผ ๋๊ผ๋ ์ ์ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค.
mybatis ๊ด๋ จ ์๋ฃ๋ ๋ถ์กฑํ์๊ณ , ์ด์ ๋ฉ์ฌ ์๋ฐ ์คํ๋ง ๊ณผ์ ์์๋ JPA๋ฅผ ์ฌ์ฉํ๊ธฐ๋๋ฌธ์ ์ด์ํ๋ ๊ฒ ๋ ์๋๊ฒ ๊ฐ์๋ค.
๋๋ Session(์ธ์ )์ ํตํ ๋ก๊ทธ์ธ ํ์๊ฐ์ ํํธ๋ฅผ ๋งก์์ผ๋ฉฐ, ์ธ์ ์ ํตํ ๋ก๊ทธ์ธ ํ์๊ฐ์ ์ ์ฒ์ ์๋ํ๋ ๋ฐฉ๋ฒ์ด์๋ค. (Jwt ๋ฐฉ์์ผ๋ก๋ ํด๋ณธ์ ์์)
JWT ์ Session ๊ธฐ๋ฐ ์ธ์ฆ์ ์ฐจ์ด๋ฅผ ๋จผ์ ์๊ฐํ๊ฒ ์ต๋๋ค.
์ ํต์ ์ธ ๋ฐฉ์์ธ ์ธ์ ์ ๋ก๊ทธ์ธ ๋ฐฉ์์ ๊ณผ์ ์ ์์๋ณด๊ฒ ์ต๋๋ค.
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 ๋ฅผ ์ฌ์ฉํด๋ณด๋ฉด์ ์กฐ๊ธ์ ์นํด์ง์ ์์์ต๋๋ค.