Search
Duplicate

resultMap

resultMap

SQL ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ Java ๊ฐ์ฒด๋กœ ๋งคํ•‘ํ•˜๋Š” ํƒœ๊ทธ์ž…๋‹ˆ๋‹ค.
resultMap์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ณต์žกํ•œ SQL ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์‰ฝ๊ฒŒ ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŠนํžˆ JOIN ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐ์ฒด๋กœ ๋งคํ•‘ํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.ย 
resultMap ์„ ์‚ฌ์šฉํ•˜๋ฉด, ์„ค์ •์„ ํ†ตํ•ด์„œ 1:1, 1:N JOIN ์ฟผ๋ฆฌ๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ์š”

โ€ข
๊ธฐ๋ณธ ๊ตฌ์กฐ
โ—ฆ
๊ตฌ์กฐ ์„ค๋ช…
โ—ฆ
๊ธฐ๋ณธ ์ฝ”๋“œ
โ€ข
์ฃผ์š” ์š”์†Œ
โ€ข
์ฃผ์š” ๊ธฐ๋Šฅ
โ€ข
์ฃผ์š” ์˜ˆ์‹œ

๊ธฐ๋ณธ ๊ตฌ์กฐ

๊ตฌ์กฐ ์„ค๋ช…

<resultMap id="๋งคํ•‘ID" type="ํŒจํ‚ค์ง€.ํด๋ž˜์Šค๋ช…"> <!-- ๊ธฐ๋ณธ ํ‚ค๋ฅผ ๋งคํ•‘ํ•˜๋Š” ์š”์†Œ --> <id property="์ž๋ฐ” ๊ฐ์ฒด์˜ ๋ณ€์ˆ˜๋ช…" column="DB ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ๋ช…"/> <!-- ์ผ๋ฐ˜ ์†์„ฑ์„ ๋งคํ•‘ํ•˜๋Š” ์š”์†Œ --> <result property="์ž๋ฐ” ๊ฐ์ฒด์˜ ๋ณ€์ˆ˜๋ช…" column="DB ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ๋ช…"/> <!-- 1:1 ๊ด€๊ณ„๋ฅผ ๋งคํ•‘ํ•˜๋Š” ์š”์†Œ --> <association property="๊ฐ์ฒด ๋ณ€์ˆ˜๋ช…" javaType="ํŒจํ‚ค์ง€.ํด๋ž˜์Šค๋ช… (์ œ2์˜ ๋งคํ•‘๊ฐ์ฒด)"> <!-- ์ค‘์ฒฉ๋œ resultMap ์š”์†Œ --> </association> <!-- 1:N ๊ด€๊ณ„๋ฅผ ๋งคํ•‘ํ•˜๋Š” ์š”์†Œ --> <collection property="์ปฌ๋ ‰์…˜ ๋ณ€์ˆ˜๋ช…" ofType="์ž๋ฐ” ์ปฌ๋ ‰์…˜ ํƒ€์ž…"> <!-- ์ค‘์ฒฉ๋œ resultMap ์š”์†Œ --> </collection> </resultMap>
XML
๋ณต์‚ฌ
1.
<resultMap>:ย resultMapย ์š”์†Œ๋Š” ๋งคํ•‘์„ ์ •์˜ํ•˜๋Š” ๋ฃจํŠธ ์š”์†Œ์ž…๋‹ˆ๋‹ค.
โ€ข
id:ย resultMap์˜ ๊ณ ์œ  ์‹๋ณ„์ž์ž…๋‹ˆ๋‹ค.
โ€ข
type: ๋งคํ•‘ํ•  Java ํด๋ž˜์Šค์˜ ์ „์ฒด ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
2.
<id>: ๊ธฐ๋ณธ ํ‚ค๋ฅผ ๋งคํ•‘ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
โ€ข
property: Java ๊ฐ์ฒด์˜ ์†์„ฑ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
โ€ข
column: SQL ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์˜ ์—ด ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
3.
<result>: ์ผ๋ฐ˜ ์†์„ฑ์„ ๋งคํ•‘ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
โ€ข
property: Java ๊ฐ์ฒด์˜ ์†์„ฑ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
โ€ข
column: SQL ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์˜ ์—ด ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
4.
<association>: 1:1 ๊ด€๊ณ„๋ฅผ ๋งคํ•‘ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
โ€ข
property: Java ๊ฐ์ฒด์˜ ์†์„ฑ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
โ€ข
javaType: ์—ฐ๊ด€๋œ Java ํด๋ž˜์Šค์˜ ์ „์ฒด ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
โ€ข
associationย ์š”์†Œ ๋‚ด์— ๋‹ค๋ฅธย resultMapย ์š”์†Œ๋ฅผ ์ค‘์ฒฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
5.
<collection>: 1:N ๊ด€๊ณ„๋ฅผ ๋งคํ•‘ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
โ€ข
property: Java ๊ฐ์ฒด์˜ ์†์„ฑ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
โ€ข
ofType: ์—ฐ๊ด€๋œ Java ํด๋ž˜์Šค์˜ ์ „์ฒด ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
โ€ข
collectionย ์š”์†Œ ๋‚ด์— ๋‹ค๋ฅธย resultMapย ์š”์†Œ๋ฅผ ์ค‘์ฒฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์ฝ”๋“œ

<?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"> <mapper namespace="com.aloha.thymeleaf_security.mapper.UserMapper"> <resultMap type="Users" id="UserMap"> <id property="no" column="no" /> <result property="no" column="no" /> <result property="username" column="username" /> <result property="password" column="password" /> <result property="name" column="name" /> <result property="email" column="email" /> <result property="enabled" column="enabled" /> <result property="createdAt" column="created_at" /> <result property="updatedAt" column="updated_at" /> </resultMap> </mapper>
XML
๋ณต์‚ฌ
@Data public class Users { private Long no; private String username; private String password; private String name; private String email; private Date createdAt; private Date updatedAt; private int enabled; }
Java
๋ณต์‚ฌ
DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `NO` bigint NOT NULL AUTO_INCREMENT, `ID` varchar(255) NOT NULL, `USERNAME` varchar(100) NOT NULL, `PASSWORD` varchar(200) NOT NULL, `NAME` varchar(100) NOT NULL, `EMAIL` varchar(200) DEFAULT NULL, `CREATED_AT` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `UPDATED_AT` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `ENABLED` int DEFAULT 1, PRIMARY KEY (`NO`) ) COMMENT='ํšŒ์›';
SQL
๋ณต์‚ฌ

์ฃผ์š” ์š”์†Œ

โ€ข
<resultMap>
โ—ฆ
<id>
โ—ฆ
<result>
โ—ฆ
<association>
โ—ฆ
<collection>
์š”์†Œ
์†์„ฑ
์„ค๋ช…
<resultMap>
id
resultMap์˜ ๊ณ ์œ  ์‹๋ณ„์ž์ž…๋‹ˆ๋‹ค.
type
๋งคํ•‘ํ•  Java ํด๋ž˜์Šค์˜ ์ „์ฒด ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
<id>
property
Java ๊ฐ์ฒด์˜ ์†์„ฑ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
column
SQL ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์˜ ์—ด ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
javaType
(์„ ํƒ ์‚ฌํ•ญ) ๋งคํ•‘ํ•  Java ํƒ€์ž…์ž…๋‹ˆ๋‹ค.
jdbcType
(์„ ํƒ ์‚ฌํ•ญ) ๋งคํ•‘ํ•  JDBC ํƒ€์ž…์ž…๋‹ˆ๋‹ค.
typeHandler
(์„ ํƒ ์‚ฌํ•ญ) ์‚ฌ์šฉ์ž ์ •์˜ ํƒ€์ž… ํ•ธ๋“ค๋Ÿฌ์ž…๋‹ˆ๋‹ค.
<result>
property
Java ๊ฐ์ฒด์˜ ์†์„ฑ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
column
SQL ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์˜ ์—ด ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
javaType
(์„ ํƒ ์‚ฌํ•ญ) ๋งคํ•‘ํ•  Java ํƒ€์ž…์ž…๋‹ˆ๋‹ค.
jdbcType
(์„ ํƒ ์‚ฌํ•ญ) ๋งคํ•‘ํ•  JDBC ํƒ€์ž…์ž…๋‹ˆ๋‹ค.
typeHandler
(์„ ํƒ ์‚ฌํ•ญ) ์‚ฌ์šฉ์ž ์ •์˜ ํƒ€์ž… ํ•ธ๋“ค๋Ÿฌ์ž…๋‹ˆ๋‹ค.
<association>
property
Java ๊ฐ์ฒด์˜ ์†์„ฑ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
javaType
์—ฐ๊ด€๋œ Java ํด๋ž˜์Šค์˜ ์ „์ฒด ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
columnPrefix
(์„ ํƒ ์‚ฌํ•ญ) ์—ด ์ด๋ฆ„์˜ ์ ‘๋‘์‚ฌ์ž…๋‹ˆ๋‹ค.
select
(์„ ํƒ ์‚ฌํ•ญ) ๋ณ„๋„์˜ select ๋ฌธ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
resultMap
(์„ ํƒ ์‚ฌํ•ญ) ์ค‘์ฒฉ๋œ resultMap์˜ ID์ž…๋‹ˆ๋‹ค.
notNullColumn
(์„ ํƒ ์‚ฌํ•ญ) null์ด ์•„๋‹Œ ์—ด์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
fetchType
(์„ ํƒ ์‚ฌํ•ญ) lazy ๋˜๋Š” eager ๋กœ๋”ฉ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
<collection>
property
Java ๊ฐ์ฒด์˜ ์†์„ฑ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
ofType
์—ฐ๊ด€๋œ Java ํด๋ž˜์Šค์˜ ์ „์ฒด ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
columnPrefix
(์„ ํƒ ์‚ฌํ•ญ) ์—ด ์ด๋ฆ„์˜ ์ ‘๋‘์‚ฌ์ž…๋‹ˆ๋‹ค.
select
(์„ ํƒ ์‚ฌํ•ญ) ๋ณ„๋„์˜ select ๋ฌธ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
resultMap
(์„ ํƒ ์‚ฌํ•ญ) ์ค‘์ฒฉ๋œ resultMap์˜ ID์ž…๋‹ˆ๋‹ค.
notNullColumn
(์„ ํƒ ์‚ฌํ•ญ) null์ด ์•„๋‹Œ ์—ด์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
fetchType
(์„ ํƒ ์‚ฌํ•ญ) lazy ๋˜๋Š” eager ๋กœ๋”ฉ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

<resultMap>

SQL ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ Java ๊ฐ์ฒด๋กœ ๋งคํ•‘ํ•˜๋Š” ๋ฃจํŠธ ์š”์†Œ์ž…๋‹ˆ๋‹ค.
์†์„ฑ
์„ค๋ช…
id
resultMap์˜ ๊ณ ์œ  ์‹๋ณ„์ž์ž…๋‹ˆ๋‹ค.
type
๋งคํ•‘ํ•  Java ํด๋ž˜์Šค์˜ ์ „์ฒด ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
<resultMap id="๋งตid" type="ํŒจํ‚ค์ง€๋ช….ํด๋ž˜์Šค๋ช…"> </resultMap>
XML
๋ณต์‚ฌ
type ์†์„ฑ์˜ ๊ฐ’์€ Java ํด๋ž˜์Šค์˜ ์ „์ฒด ์ด๋ฆ„ (ํŒจํ‚ค์ง€๋ช….ํด๋ž˜์Šค๋ช…)์„ ์ง€์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
typeAliases ๋ณ„์นญ ์„ค์ •์ด ๋˜์–ด์žˆ์œผ๋ฉด type ์†์„ฑ๊ฐ’์œผ๋กœ ๋ณ„์นญ์„ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

typeAliases ์„ค์ • ๋ฐฉ๋ฒ•

mybatis ์—์„œ Java ํด๋ž˜์Šค ์ „์ฒด์ด๋ฆ„(ํŒจํ‚ค์ง€๋ช….ํด๋ž˜์Šค๋ช…)์„ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋ž˜ ๋ฐฉ๋ฒ• ์ค‘์— ํ•˜๋‚˜๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
โ€ข
mybatis-config.xml
โ€ข
application.properties
โ€ข
@Alias ์–ด๋…ธํ…Œ์ด์…˜

mybatis-config.xml

โ€ข
์„ค์ • ํŒŒ์ผ ์œ„์น˜
โ—ฆ
~/src/main/resources
โ–ช
mybatis-config.xml
โ€ข
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "https://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!-- ์„ค์ • --> <settings> <!-- ์–ธ๋”์Šค์ฝ”์–ด ์ผ€์ด์Šค์ธ ์ปฌ๋Ÿผ์„ ์นด๋ฉœ ์ผ€์ด์Šค๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์„ค์ • --> <!-- board_no - boardNo --> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings> <!-- ํƒ€์ž… ๋ณ„์นญ ์„ค์ • --> <typeAliases> <!-- โญ typeAlias : ๋ณ„์นญ ์„ค์ • - alias : ๋ณ„์นญ - type : ๋ณ„์นญ์„ ์‚ฌ์šฉํ•  ํด๋ž˜์Šค ๊ฒฝ๋กœ --> <typeAlias alias="User" type="com.aloha.mybatis.dto.User"/> <!-- โญ package : ํŒจํ‚ค์ง€ ๊ฒฝ๋กœ ์ง€์ • - name : ํŒจํ‚ค์ง€ ๊ฒฝ๋กœ --> <package name="com.aloha.mybatis.dto"/> </typeAliases> </configuration>
XML
๋ณต์‚ฌ
โ€ข
application.properties
# Mybatis ์„ค์ • # Mybatis ์„ค์ • ๊ฒฝ๋กœ : ~/resources/mybatis-config.xml mybatis.config-location=classpath:mybatis-config.xml # Mybatis ๋งคํผ ํŒŒ์ผ ๊ฒฝ๋กœ : ~/๋ฉ”์ธํŒจํ‚ค์ง€/mapper/**Mapper.xml mybatis.mapper-locations=classpath:mybatis/mapper/**/**.xml
Java
๋ณต์‚ฌ
ํƒ€์ž… ๋ณ„์นญ package ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•˜๋ฉด, ํ•ด๋‹น ํŒจํ‚ค์ง€ ์•„๋ž˜์˜ ๋ชจ๋“  ํด๋ž˜์Šค๋“ค์„ ํด๋ž˜์Šค ์ด๋ฆ„๋งŒ์œผ๋กœ type ์„ ์ง€์ •ํ• ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
โ€ข
typeAliases - package ์„ค์ •
<resultMap id="๋งตid" type="ํŒจํ‚ค์ง€๋ช….ํด๋ž˜์Šค๋ช…"> </resultMap>
XML
๋ณต์‚ฌ
โ€ข
typeAliases - package ์„ค์ •
<!-- <resultMap id="๋งตid" type="ํŒจํ‚ค์ง€๋ช….ํด๋ž˜์Šค๋ช…"> --> <resultMap id="๋งตid" type="ํด๋ž˜์Šค๋ช…"> </resultMap>
XML
๋ณต์‚ฌ
mybatis-config.xml ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค ์„ค์ •ํŒŒ์ผ์„ ๋”ฐ๋กœ ๋งŒ๋“ค์ง€ ์•Š๊ณ ,
application.properties ์˜ ์†์„ฑ์œผ๋กœ ๋ฐ”๋กœ ์ ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
# Mybatis ์„ค์ • # ์ปฌ๋Ÿผ๋ช…์„ ๋ณ€์ˆ˜๋ช…์œผ๋กœ ์ž๋™๋งคํ•‘ : board_no โžก boardNo mybatis.configuration.map-underscore-to-camel-case=true # resultType ์†์„ฑ์—์„œ dto ๊ฐ์ฒด (ํŒจํ‚ค์ง€.ํด๋ž˜์Šค๋ช…) โžก (ํด๋ž˜์Šค๋ช…) mybatis.type-aliases-package=com.aloha.mybatis.dto # Mybatis ๋งคํผ ํŒŒ์ผ ๊ฒฝ๋กœ : ~/๋ฉ”์ธํŒจํ‚ค์ง€/mapper/**Mapper.xml mybatis.mapper-locations=classpath:mybatis/mapper/**/**.xml
Java
๋ณต์‚ฌ

@Alias ์–ด๋…ธํ…Œ์ด์…˜

mybatis-config.xml ๋˜๋Š” application properties ์— MyBatis๊ฐ€ ์ง€์ •๋œ ํŒจํ‚ค์ง€ ๋‚ด์˜ ํด๋ž˜์Šค์— ๋Œ€ํ•ด ํƒ€์ž… ๋ณ„์นญ์„ ์ž๋™์œผ๋กœ ์Šค์บ”ํ•˜๋„๋ก ์„ค์ •ํ•ด์•ผ @Alias ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋งคํ•‘ํ•  ๊ฐ ๊ฐ์ฒด์—์„œ, @Alias ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ๋ณ„์นญ์„ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•
package com.aloha.mybaits.dto; ... @Data @Alias("Users") public class Users { private Long no; private String username; private String password; private String name; private String email; private Date createdAt; private Date updatedAt; private int enabled; }
Java
๋ณต์‚ฌ
โ€ข
@Alias("Users") ์„ค์ •
<!-- โญ typeAliases ์„ค์ •ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ - ํŒจํ‚ค์ง€๋ช….ํด๋ž˜์Šค๋ช… --> <select id="select" resultType="com.aloha.mybatis.dto.Users"> SELECT * FROM user WHERE username = #{username} </select>
XML
๋ณต์‚ฌ
โ€ข
@Alias("Users") ์„ค์ •
<!-- โญ typeAliases ์„ค์ •ํ•œ ๊ฒฝ์šฐ - ๋ณ„์นญ (Users) --> <select id="select" resultType="Users"> SELECT * FROM user WHERE username = #{username} </select>
XML
๋ณต์‚ฌ

<id>

๊ธฐ๋ณธ ํ‚ค๋ฅผ ๋งคํ•‘ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์š”์†Œ์ž…๋‹ˆ๋‹ค.
์†์„ฑ
์„ค๋ช…
property
Java ๊ฐ์ฒด์˜ ์†์„ฑ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
column
SQL ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์˜ ์—ด ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
javaType
(์„ ํƒ ์‚ฌํ•ญ) ๋งคํ•‘ํ•  Java ํƒ€์ž…์ž…๋‹ˆ๋‹ค.
jdbcType
(์„ ํƒ ์‚ฌํ•ญ) ๋งคํ•‘ํ•  JDBC ํƒ€์ž…์ž…๋‹ˆ๋‹ค.
typeHandler
(์„ ํƒ ์‚ฌํ•ญ) ์‚ฌ์šฉ์ž ์ •์˜ ํƒ€์ž… ํ•ธ๋“ค๋Ÿฌ์ž…๋‹ˆ๋‹ค.

<result>

์ผ๋ฐ˜ ์†์„ฑ์„ ๋งคํ•‘ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์š”์†Œ์ž…๋‹ˆ๋‹ค.
์†์„ฑ
์„ค๋ช…
property
Java ๊ฐ์ฒด์˜ ์†์„ฑ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
column
SQL ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์˜ ์—ด ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
javaType
(์„ ํƒ ์‚ฌํ•ญ) ๋งคํ•‘ํ•  Java ํƒ€์ž…์ž…๋‹ˆ๋‹ค.
jdbcType
(์„ ํƒ ์‚ฌํ•ญ) ๋งคํ•‘ํ•  JDBC ํƒ€์ž…์ž…๋‹ˆ๋‹ค.
typeHandler
(์„ ํƒ ์‚ฌํ•ญ) ์‚ฌ์šฉ์ž ์ •์˜ ํƒ€์ž… ํ•ธ๋“ค๋Ÿฌ์ž…๋‹ˆ๋‹ค.

<association>

1:1 ๊ด€๊ณ„๋ฅผ ๋งคํ•‘ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์š”์†Œ์ž…๋‹ˆ๋‹ค.
์†์„ฑ
์„ค๋ช…
property
Java ๊ฐ์ฒด์˜ ์†์„ฑ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
javaType
์—ฐ๊ด€๋œ Java ํด๋ž˜์Šค์˜ ์ „์ฒด ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
columnPrefix
(์„ ํƒ ์‚ฌํ•ญ) ์—ด ์ด๋ฆ„์˜ ์ ‘๋‘์‚ฌ์ž…๋‹ˆ๋‹ค.
select
(์„ ํƒ ์‚ฌํ•ญ) ๋ณ„๋„์˜ select ๋ฌธ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
resultMap
(์„ ํƒ ์‚ฌํ•ญ) ์ค‘์ฒฉ๋œ resultMap์˜ ID์ž…๋‹ˆ๋‹ค.
notNullColumn
(์„ ํƒ ์‚ฌํ•ญ) null์ด ์•„๋‹Œ ์—ด์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
fetchType
(์„ ํƒ ์‚ฌํ•ญ) lazy ๋˜๋Š” eager ๋กœ๋”ฉ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

<collection>

1:N ๊ด€๊ณ„๋ฅผ ๋งคํ•‘ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์š”์†Œ์ž…๋‹ˆ๋‹ค.
์†์„ฑ
์„ค๋ช…
property
Java ๊ฐ์ฒด์˜ ์†์„ฑ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
ofType
์—ฐ๊ด€๋œ Java ํด๋ž˜์Šค์˜ ์ „์ฒด ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
columnPrefix
(์„ ํƒ ์‚ฌํ•ญ) ์—ด ์ด๋ฆ„์˜ ์ ‘๋‘์‚ฌ์ž…๋‹ˆ๋‹ค.
select
(์„ ํƒ ์‚ฌํ•ญ) ๋ณ„๋„์˜ select ๋ฌธ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
resultMap
(์„ ํƒ ์‚ฌํ•ญ) ์ค‘์ฒฉ๋œ resultMap์˜ ID์ž…๋‹ˆ๋‹ค.
notNullColumn
(์„ ํƒ ์‚ฌํ•ญ) null์ด ์•„๋‹Œ ์—ด์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
fetchType
(์„ ํƒ ์‚ฌํ•ญ) lazy ๋˜๋Š” eager ๋กœ๋”ฉ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ๊ธฐ๋Šฅ

1.
๊ฐ์ฒด ๋งคํ•‘ (Object Mapping)
2.
1:1 ์กฐ์ธ (One-to-One Join)
3.
1:N ์กฐ์ธ (One-to-Many Join)
4.
๋‹ค์ค‘ ๋งคํ•‘ (Multiple Mapping)
5.
์ƒ์† ๋งคํ•‘ (Inheritance Mapping)
6.
๋ณตํ•ฉ ํ‚ค ๋งคํ•‘ (Composite Key Mapping)
7.
๋„ค์ž„์ŠคํŽ˜์ด์Šค ์‚ฌ์šฉ (Namespace Usage)
8.
์ž๋™ ๋งคํ•‘ (Auto Mapping)
resultMap์€ MyBatis์—์„œ SQL ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ Java ๊ฐ์ฒด๋กœ ๋งคํ•‘ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋‹ค์–‘ํ•œ ๋งคํ•‘ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.ย 

1. ๊ฐ์ฒด ๋งคํ•‘ (Object Mapping)

SQL ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ Java ๊ฐ์ฒด์˜ ์†์„ฑ์— ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์ปฌ๋Ÿผ์„ ๊ฐ์ฒด์˜ ์†์„ฑ์— ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
<resultMap id="UserMap" type="User"> <id property="id" column="id"/> <result property="username" column="username"/> <result property="password" column="password"/> <result property="name" column="name"/> <result property="email" column="email"/> <result property="enabled" column="enabled"/> <result property="createdAt" column="created_at"/> <result property="updatedAt" column="updated_at"/> </resultMap>
XML
๋ณต์‚ฌ

2. 1:1 ์กฐ์ธ (One-to-One Join)

๋‹ค๋ฅธ ํ…Œ์ด๋ธ”๊ณผ์˜ 1:1 ๊ด€๊ณ„๋ฅผ ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค.ย associationย ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ๊ฐ์ฒด์™€์˜ ๊ด€๊ณ„๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
<resultMap id="UserMap" type="User"> <id property="id" column="id"/> <result property="username" column="username"/> <result property="password" column="password"/> <result property="name" column="name"/> <result property="email" column="email"/> <result property="enabled" column="enabled"/> <result property="createdAt" column="created_at"/> <result property="updatedAt" column="updated_at"/> <association property="profile" javaType="Profile"> <id property="id" column="profile_id"/> <result property="bio" column="bio"/> <result property="website" column="website"/> </association> </resultMap>
XML
๋ณต์‚ฌ

3. 1:N ์กฐ์ธ (One-to-Many Join)

๋‹ค๋ฅธ ํ…Œ์ด๋ธ”๊ณผ์˜ 1:N ๊ด€๊ณ„๋ฅผ ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค.ย collectionย ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปฌ๋ ‰์…˜ ์†์„ฑ์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
<resultMap id="UserMap" type="User"> <id property="id" column="id"/> <result property="username" column="username"/> <result property="password" column="password"/> <result property="name" column="name"/> <result property="email" column="email"/> <result property="enabled" column="enabled"/> <result property="createdAt" column="created_at"/> <result property="updatedAt" column="updated_at"/> <collection property="roles" ofType="Role"> <id property="id" column="role_id"/> <result property="name" column="role_name"/> </collection> </resultMap>
XML
๋ณต์‚ฌ

4. ๋‹ค์ค‘ ๋งคํ•‘ (Multiple Mapping)

์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”์˜ ๊ฒฐ๊ณผ๋ฅผ ํ•˜๋‚˜์˜ ๊ฐ์ฒด์— ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.ย association๊ณผย collection์„ ์กฐํ•ฉํ•˜์—ฌ ๋ณต์žกํ•œ ๋งคํ•‘์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
<resultMap id="UserMap" type="User"> <id property="id" column="id"/> <result property="username" column="username"/> <result property="password" column="password"/> <result property="name" column="name"/> <result property="email" column="email"/> <result property="enabled" column="enabled"/> <result property="createdAt" column="created_at"/> <result property="updatedAt" column="updated_at"/> <association property="profile" javaType="Profile"> <id property="id" column="profile_id"/> <result property="bio" column="bio"/> <result property="website" column="website"/> </association> <collection property="roles" ofType="Role"> <id property="id" column="role_id"/> <result property="name" column="role_name"/> </collection> </resultMap>
XML
๋ณต์‚ฌ

5. ์ƒ์† ๋งคํ•‘ (Inheritance Mapping)

์ƒ์† ๊ด€๊ณ„๋ฅผ ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.ย discriminatorย ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์† ๊ด€๊ณ„๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
<resultMap id="vehicleMap" type="Vehicle"> <id property="id" column="id"/> <result property="make" column="make"/> <result property="model" column="model"/> <discriminator javaType="string" column="type"> <case value="car" resultType="Car"/> <case value="truck" resultType="Truck"/> </discriminator> </resultMap>
XML
๋ณต์‚ฌ

6. ๋ณตํ•ฉ ํ‚ค ๋งคํ•‘ (Composite Key Mapping)

๋ณตํ•ฉ ํ‚ค๋ฅผ ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์ปฌ๋Ÿผ์„ ํ•˜๋‚˜์˜ ํ‚ค๋กœ ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
<resultMap id="orderMap" type="Order"> <id property="orderId" column="order_id"/> <id property="productId" column="product_id"/> <result property="quantity" column="quantity"/> <result property="price" column="price"/> </resultMap>
XML
๋ณต์‚ฌ

7. ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์‚ฌ์šฉ (Namespace Usage)

๋‹ค๋ฅธย resultMap์„ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.ย extendsย ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธย resultMap์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
<resultMap id="baseUserMap" type="User"> <id property="id" column="id"/> <result property="username" column="username"/> <result property="password" column="password"/> </resultMap> <resultMap id="extendedUserMap" extends="baseUserMap"> <result property="name" column="name"/> <result property="email" column="email"/> </resultMap>
XML
๋ณต์‚ฌ

8. ์ž๋™ ๋งคํ•‘ (Auto Mapping)

MyBatis๋Š” ์ž๋™ ๋งคํ•‘ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์—ฌ SQL ๊ฒฐ๊ณผ๋ฅผ ์ž๋™์œผ๋กœ Java ๊ฐ์ฒด์— ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.ย autoMappingย ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž๋™ ๋งคํ•‘์„ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
<resultMap id="UserMap" type="User" autoMapping="true"> <id property="id" column="id"/> <result property="username" column="username"/> <result property="password" column="password"/> <result property="name" column="name"/> <result property="email" column="email"/> <result property="enabled" column="enabled"/> <result property="createdAt" column="created_at"/> <result property="updatedAt" column="updated_at"/> </resultMap>
XML
๋ณต์‚ฌ
resultMap์„ ์‚ฌ์šฉํ•˜๋ฉด MyBatis์—์„œ ๋‹ค์–‘ํ•œ ๋งคํ•‘ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์ฒด ๋งคํ•‘, 1:1 ์กฐ์ธ, 1:N ์กฐ์ธ, ๋‹ค์ค‘ ๋งคํ•‘, ์ƒ์† ๋งคํ•‘, ๋ณตํ•ฉ ํ‚ค ๋งคํ•‘, ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์‚ฌ์šฉ, ์ž๋™ ๋งคํ•‘ ๋“ฑ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜์—ฌ ๋ณต์žกํ•œ SQL ๊ฒฐ๊ณผ๋ฅผ Java ๊ฐ์ฒด๋กœ ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ์ „์†ก์„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์š” ์˜ˆ์‹œ

โ€ข
์กฐ์ธ
โ—ฆ
1:1 ์กฐ์ธ - association
โ—ฆ
1:N ์กฐ์ธ - collection

์กฐ์ธ

โ€ข
1:1 ์กฐ์ธ - association
โ€ข
1:N ์กฐ์ธ - collection

์˜ˆ์‹œ ๊ฐ์ฒด ๋ฐ ํ…Œ์ด๋ธ”

โ€ข
user.sql
โ€ข
user_auth.sql
โ€ข
board.sql
โ€ข
Users.java
โ€ข
UserAuth.java

user.sql

DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `NO` bigint NOT NULL AUTO_INCREMENT, `ID` VARCHAR(255) NOT NULL COMMENT 'UK', `USERNAME` varchar(100) NOT NULL, `PASSWORD` varchar(200) NOT NULL, `NAME` varchar(100) NOT NULL, `EMAIL` varchar(200) DEFAULT NULL, `CREATED_AT` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `UPDATED_AT` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `ENABLED` int DEFAULT 1, PRIMARY KEY (`NO`) ) COMMENT='ํšŒ์›';
SQL
๋ณต์‚ฌ

user_auth.sql

DROP TABLE IF EXISTS `user_auth`; CREATE TABLE `user_auth` ( no bigint NOT NULL AUTO_INCREMENT -- ๊ถŒํ•œ๋ฒˆํ˜ธ `id` VARCHAR(255) NOT NULL COMMENT 'UK', , username varchar(100) NOT NULL -- ์•„์ด๋”” , auth varchar(100) NOT NULL -- ๊ถŒํ•œ (ROLE_USER, ROLE_ADMIN, ...) , PRIMARY KEY(no) );
SQL
๋ณต์‚ฌ

board.sql

DROP TABLE IF EXISTS `board`; CREATE TABLE `board` ( `no` BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'PK', `id` VARCHAR(255) NOT NULL COMMENT 'UK', `title` VARCHAR(100) NOT NULL COMMENT '์ œ๋ชฉ', `user_no` BIGINT NOT NULL COMMENT 'ํšŒ์›PK', `content` TEXT NULL COMMENT '๋‚ด์šฉ', `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '๋“ฑ๋ก์ผ์ž', `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '์ˆ˜์ •์ผ์ž' ); ALTER TABLE `board` ADD CONSTRAINT `FK_users_TO_board_1` FOREIGN KEY ( `user_no` ) REFERENCES `users` ( `no` ) ON DELETE CASCADE ;
SQL
๋ณต์‚ฌ

Users.java

@Data public class Users { private Long no; private String id; private String username; private String password; private String name; private String email; private Date createdAt; private Date updatedAt; private int enabled; private List<UserAuth> authList; public Users() { this.id = UUID.randomUUID().toString(); } }
Java
๋ณต์‚ฌ

UserAuth.java

@Data public class UserAuth { private Long no; private String id; private String username; private String auth; private Date createdAt; private Date updatedAt; public UserAuth() { this.id = UUID.randomUUID().toString(); } }
Java
๋ณต์‚ฌ

Board.java

@Data @AllArgsConstructor @Builder public class Board { private Long no; private String id; private String title; private Long userNo; private String content; private Date createdAt; private Date updatedAt; // ์œ ์ € Users user; public Board() { this.id = UUID.randomUUID().toString(); } }
Java
๋ณต์‚ฌ

1:1 ์กฐ์ธ - association

association

MyBatis์—์„œ 1:1 ๊ด€๊ณ„๋ฅผ ๋งคํ•‘ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ์š”์†Œ์ž…๋‹ˆ๋‹ค. ์ด๋Š” SQL ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ Java ๊ฐ์ฒด์˜ ์†์„ฑ์œผ๋กœ ๋งคํ•‘ํ•  ๋•Œ, ๋‹ค๋ฅธ ๊ฐ์ฒด์™€์˜ 1:1 ๊ด€๊ณ„๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋ฐฉ๋ฒ•

โ€ข
๋ฐฉ๋ฒ• 1 - JOIN ์ฟผ๋ฆฌ ์ง์ ‘ ์ž‘์„ฑ
โ€ข
๋ฐฉ๋ฒ• 2 - 2๊ฐœ์˜ ์ฟผ๋ฆฌ๋ฅผ ์—ฐ๊ฒฐ
board ํ…Œ์ด๋ธ”๊ณผ user ํ…Œ์ด๋ธ”์„ 1:1 ๋กœ ์กฐ์ธํ•˜์—ฌ, board ํ…Œ์ด๋ธ”์˜ user_no ๋กœ user ํ…Œ์ด๋ธ”์˜ no (PK) ์ฐธ์กฐํ•˜์—ฌ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.
์ด ๋•Œ, Board ๊ฐ์ฒด ์•ˆ์˜ ํ•„๋“œ(๋ฉค๋ฒ„๋ณ€์ˆ˜)์ธ Users ๊ฐ์ฒด์— ์กฐ์ธ ๊ฒฐ๊ณผ๋ฅผ ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š”, ๊ฒŒ์‹œ๊ธ€ ์ •๋ณด ์กฐํšŒ ์‹œ, ์‚ฌ์šฉ์ž ์ •๋ณด(์ด๋ฆ„)์„ ์ฐธ์กฐํ•˜์—ฌ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ฐฉ๋ฒ• 1 - JOIN ์ฟผ๋ฆฌ ์ง์ ‘ ์ž‘์„ฑ

<resultMap id="BoardMap" type="Board"> <!-- Board ํ•„๋“œ ๋งคํ•‘ --> <id property="no" column="no" /> <result property="id" column="id" /> <result property="title" column="title" /> <result property="content" column="content" /> <result property="userNo" column="user_no" /> <result property="createdAt" column="created_at" /> <result property="updatedAt" column="updated_at" /> <!-- Users ๊ฐ์ฒด ๋งคํ•‘ --> <association property="user" javaType="Users"> <id property="no" column="user_no" /> <result property="name" column="name" /> <result property="username" column="username"/> </association> </resultMap>
XML
๋ณต์‚ฌ
<select id="list" resultMap="BoardMap"> SELECT b.* ,u.no user_no ,u.name ,u.username FROM board b JOIN user u ON b.user_no = u.no </select>
XML
๋ณต์‚ฌ

๋ฐฉ๋ฒ• 2 - 2๊ฐœ์˜ ์ฟผ๋ฆฌ๋ฅผ ์—ฐ๊ฒฐ

<resultMap id="BoardMap" type="Board"> <!-- Board ํ•„๋“œ ๋งคํ•‘ --> <id property="no" column="no" /> <result property="id" column="id" /> <result property="title" column="title" /> <result property="content" column="content" /> <result property="userNo" column="user_no" /> <result property="createdAt" column="created_at" /> <result property="updatedAt" column="updated_at" /> <!-- Users ๊ฐ์ฒด ๋งคํ•‘ --> <association property="user" select="selectUser" column="user_no" ofType="com.aloha.security_method.domain.Users"> <id property="no" column="user_no" /> <result property="name" column="name" /> <result property="username" column="username"/> </association> </resultMap>
XML
๋ณต์‚ฌ

association

โ€ข
property:
โ—ฆ
์ฃผ ๊ฐ์ฒด์˜ ์†์„ฑ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
โ—ฆ
์ด ์†์„ฑ์€ ์—ฐ๊ด€๋œ ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•  ์†์„ฑ์ž…๋‹ˆ๋‹ค.
โ—ฆ
์—ฌ๊ธฐ์„œ๋Š”, Board ๊ฐ์ฒด์˜ Users user; ๋ณ€์ˆ˜๋กœ ์„ ์–ธ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
โ€ข
select
โ—ฆ
์—ฐ๊ด€๋œ ๊ฐ์ฒด๋ฅผ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•œ SQL ์ฟผ๋ฆฌ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
โ—ฆ
์ด ์ฟผ๋ฆฌ๋Š” ๋‹ค๋ฅธ ๋งคํผ ๋ฉ”์†Œ๋“œ๋กœ ์ •์˜๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
โ—ฆ
์—ฌ๊ธฐ์„œ๋Š”, selectUser select ํƒœ๊ทธ id ๋กœ ์ฟผ๋ฆฌ๊ฐ€ ์ง€์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
โ€ข
column
โ—ฆ
์ฃผ ๊ฐ์ฒด์˜ ์ปฌ๋Ÿผ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
โ—ฆ
์ด ์ปฌ๋Ÿผ์˜ ๊ฐ’์ด ์—ฐ๊ด€๋œ ๊ฐ์ฒด๋ฅผ ์กฐํšŒํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
โ—ฆ
์—ฌ๊ธฐ์„œ๋Š”, board ํ…Œ์ด๋ธ”์˜ user_no ๋ฅผ ์ง€์ •ํ•˜์—ฌ, ์„œ๋ธŒ์ฟผ๋ฆฌ์— ์ „๋‹ฌํ•˜์—ฌ ์กฐ์ธํ•ฉ๋‹ˆ๋‹ค.
โ€ข
ofType
โ—ฆ
์—ฐ๊ด€๋œ ๊ฐ์ฒด์˜ ํƒ€์ž…์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
โ—ฆ
์ด ์†์„ฑ์€ ์—ฐ๊ด€๋œ ๊ฐ์ฒด์˜ Java ํด๋ž˜์Šค ํƒ€์ž…์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
โ—ฆ
์—ฌ๊ธฐ์„œ๋Š”, Users ๊ฐ์ฒด๋กœ ๋งคํ•‘๋˜๋„๋ก ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
โ€ข
๋ฉ”์ธ ์ฟผ๋ฆฌ
<select id="list" resultMap="BoardMap"> SELECT * FROM board </select>
XML
๋ณต์‚ฌ
โ€ข
์„œ๋ธŒ ์ฟผ๋ฆฌ
โ—ฆ
resultType ์œผ๋กœ ์ง€์ •
โ—ฆ
resultMap ์œผ๋กœ ์ง€์ •
โ€ข
resultType ์œผ๋กœ ์ง€์ •
<select id="selectUser" resultType="Users"> SELECT u.no user_no ,u.* FROM user WHERE user_no= #{user_no} </select>
XML
๋ณต์‚ฌ
โ€ข
resultMap ์œผ๋กœ ์ง€์ •
<select id="selectUser" resultMap="UserMap"> SELECT u.no user_no ,u.* FROM user WHERE user_no= #{user_no} </select>
XML
๋ณต์‚ฌ
(UserMap ์€ ์•„์ง ๋ฏธ๊ตฌํ˜„ ๋’ค์— 1:N ์กฐ์ธ - collection ์—์„œ ๊ตฌํ˜„)
resultMap ์œผ๋กœ, JOIN ์‹œ, ํ•˜์œ„ ๋งคํ•‘ ํƒ€์ž…๋„ resultMap ์ด๊ณ  ๊ทธ ๋งคํ•‘์—์„œ๋„ ์กฐ์ธ์„ ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์ด ๊ณ„์ธต์ ์œผ๋กœ ์กฐํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
์ฆ‰, ๊ฒŒ์‹œ๊ธ€ ์ •๋ณด์™€ ํšŒ์› ์ •๋ณด๋ฅผ ์กฐ์ธํ•˜๋ฉด์„œ, ํšŒ์›์ •๋ณด์™€ ๊ถŒํ•œ ์ •๋ณด๊ฐ€ ์กฐ์ธ๋˜์–ด ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.
โ€ข
BoardMap
โ—ฆ
UserMap
โ–ช
AuthMap

1:N ์กฐ์ธ - collection

collection

MyBatis์—์„œย collectionย ์š”์†Œ๋Š” 1:N ๊ด€๊ณ„๋ฅผ ๋งคํ•‘ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” SQL ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ Java ๊ฐ์ฒด์˜ ์ปฌ๋ ‰์…˜ ์†์„ฑ์œผ๋กœ ๋งคํ•‘ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ

1.
user - user_auth JOIN
2.
board - user JOIN

user - user_auth JOIN

๋ฐฉ๋ฒ•

โ€ข
๋ฐฉ๋ฒ• 1 - JOIN ์ฟผ๋ฆฌ ์ง์ ‘ ์ž‘์„ฑ
โ€ข
๋ฐฉ๋ฒ• 2 - 2๊ฐœ์˜ ์ฟผ๋ฆฌ๋ฅผ ์—ฐ๊ฒฐ
user ํ…Œ์ด๋ธ”๊ณผ user_auth ํ…Œ์ด๋ธ”์„ 1:N ๋กœ ์กฐ์ธํ•˜์—ฌ, user ํ…Œ์ด๋ธ”์˜ username ๊ณผ user_auth ํ…Œ์ด๋ธ”์˜ username ๋ฅผ ์กฐ์ธ ์กฐ๊ฑด์œผ๋กœ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.
์ด ๋•Œ, Users ๊ฐ์ฒด ์•ˆ์˜ ํ•„๋“œ(๋ฉค๋ฒ„๋ณ€์ˆ˜)์ธ List<UserAuth> ์ปฌ๋ ‰์…˜์— ์กฐ์ธ ๊ฒฐ๊ณผ๋ฅผ ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š”, ํšŒ์› ์ •๋ณด ์กฐํšŒ ์‹œ, ํšŒ์› ๊ถŒํ•œ ๋ชฉ๋ก์„ ํ•จ๊ป˜ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ฐฉ๋ฒ• 1 - JOIN ์ฟผ๋ฆฌ ์ง์ ‘ ์ž‘์„ฑ

<resultMap id="UserMap" type="com.aloha.security_method.domain.Users"> <id property="no" column="no" /> <result property="username" column="username" /> <result property="password" column="password" /> <result property="name" column="name" /> <result property="email" column="email" /> <result property="enabled" column="enabled" /> <result property="createdAt" column="created_at" /> <result property="updatedAt" column="updated_at" /> <collection property="authList" resultMap="authMap"></collection> </resultMap> <resultMap id="authMap" type="UserAuth"> <id property="no" column="auth_no" /> <result property="id" column="auth_id" /> <result property="username" column="username" /> <result property="userNo" column="user_no" /> <result property="auth" column="auth" /> <result property="createdAt" column="created_at" /> <result property="updatedAt" column="updated_at" /> </resultMap>
XML
๋ณต์‚ฌ
<select id="select" resultMap="UserMap"> SELECT u.no ,u.username ,password ,name ,email ,enabled ,u.created_at ,u.updated_at ,auth.no auth_no ,auth.id auth_id ,auth.user_no ,auth.auth auth FROM user u LEFT OUTER JOIN user_auth auth ON u.username = auth.username WHERE u.username = #{username} </select>
XML
๋ณต์‚ฌ

๋ฐฉ๋ฒ• 2 - 2๊ฐœ์˜ ์ฟผ๋ฆฌ๋ฅผ ์—ฐ๊ฒฐ

<resultMap id="UserMap" type="com.aloha.security_method.domain.Users"> <id property="no" column="no" /> <result property="username" column="username" /> <result property="password" column="password" /> <result property="name" column="name" /> <result property="email" column="email" /> <result property="enabled" column="enabled" /> <result property="createdAt" column="created_at" /> <result property="updatedAt" column="updated_at" /> <collection property="authList" select="selectAuthList" column="username" javaType="list" ofType="com.car.ckauto.domain.users.UserAuth" ></collection> </resultMap>
XML
๋ณต์‚ฌ

collection

โ€ข
property:
โ—ฆ
์ฃผ ๊ฐ์ฒด์˜ ์†์„ฑ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
โ—ฆ
์ด ์†์„ฑ์€ ์—ฐ๊ด€๋œ ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•  ์†์„ฑ์ž…๋‹ˆ๋‹ค.
โ—ฆ
์—ฌ๊ธฐ์„œ๋Š”, Users ๊ฐ์ฒด์˜ List<UserAuth> authList; ๋ณ€์ˆ˜๋กœ ์„ ์–ธ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
โ€ข
select
โ—ฆ
์—ฐ๊ด€๋œ ๊ฐ์ฒด๋ฅผ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•œ SQL ์ฟผ๋ฆฌ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
โ—ฆ
์ด ์ฟผ๋ฆฌ๋Š” ๋‹ค๋ฅธ ๋งคํผ ๋ฉ”์†Œ๋“œ๋กœ ์ •์˜๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
โ—ฆ
์—ฌ๊ธฐ์„œ๋Š”, selectAuthList select ํƒœ๊ทธ id ๋กœ ์ฟผ๋ฆฌ๊ฐ€ ์ง€์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
โ€ข
column
โ—ฆ
์ฃผ ๊ฐ์ฒด์˜ ์ปฌ๋Ÿผ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
โ—ฆ
์ด ์ปฌ๋Ÿผ์˜ ๊ฐ’์ด ์—ฐ๊ด€๋œ ๊ฐ์ฒด๋ฅผ ์กฐํšŒํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
โ—ฆ
์—ฌ๊ธฐ์„œ๋Š”, user ํ…Œ์ด๋ธ”์˜ username ๋ฅผ ์ง€์ •ํ•˜์—ฌ, ์„œ๋ธŒ์ฟผ๋ฆฌ์— ์ „๋‹ฌํ•˜์—ฌ ์กฐ์ธํ•ฉ๋‹ˆ๋‹ค.
โ€ข
ofType
โ—ฆ
์—ฐ๊ด€๋œ ๊ฐ์ฒด์˜ ํƒ€์ž…์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
โ—ฆ
์ด ์†์„ฑ์€ ์—ฐ๊ด€๋œ ๊ฐ์ฒด์˜ Java ํด๋ž˜์Šค ํƒ€์ž…์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
โ—ฆ
์—ฌ๊ธฐ์„œ๋Š”, UserAuth ๊ฐ์ฒด๋กœ ๋งคํ•‘๋˜๋„๋ก ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
โ€ข
๋ฉ”์ธ ์ฟผ๋ฆฌ
<select id="select" resultMap="UserMap"> SELECT * FROM user u WHERE u.username = #{username} </select>
XML
๋ณต์‚ฌ
โ€ข
์„œ๋ธŒ ์ฟผ๋ฆฌ
<select id="selectAuthList" resultType="UserAuth"> SELECT * FROM user_auth WHERE username = #{username} </select>
XML
๋ณต์‚ฌ

board - user JOIN

โ€ข
BoardMapper.xml
โ€ข
UserMapper.xml
โ€ข
JOIN ํ…Œ์ด๋ธ” ๊ด€๊ณ„
boad : user = 1 : 1 user : user_auth = 1 : N

BoardMapper.xml

<resultMap id="BoardMap" type="Board"> <!-- Board ํ•„๋“œ ๋งคํ•‘ --> <id property="no" column="no" /> <result property="id" column="id" /> <result property="title" column="title" /> <result property="content" column="content" /> <result property="userNo" column="user_no" /> <result property="createdAt" column="created_at" /> <result property="updatedAt" column="updated_at" /> <!-- Users ๊ฐ์ฒด ๋งคํ•‘ --> <association property="user" select="selectUser" column="user_no" javaType="com.aloha.security_method.domain.Users"></association> </resultMap>
XML
๋ณต์‚ฌ
<select id="list" resultMap="BoardMap"> SELECT b.* FROM board b </select>
XML
๋ณต์‚ฌ
<select id="selectUser" resultMap="com.aloha.security_method.mapper.UserMapper.UserMap"> SELECT * FROM user u WHERE u.no = #{user_no} </select>
XML
๋ณต์‚ฌ

UserMapper.xml

<resultMap id="UserMap" type="com.aloha.security_method.domain.Users"> <id property="no" column="no" /> <result property="username" column="username" /> <result property="password" column="password" /> <result property="name" column="name" /> <result property="email" column="email" /> <result property="enabled" column="enabled" /> <result property="createdAt" column="created_at" /> <result property="updatedAt" column="updated_at" /> <collection property="authList" select="selectAuthList" column="username" javaType="list" ofType="com.car.ckauto.domain.users.UserAuth" ></collection> </resultMap>
XML
๋ณต์‚ฌ
<select id="select" resultMap="UserMap"> SELECT * FROM user u WHERE u.username = #{username} </select>
XML
๋ณต์‚ฌ
<select id="selectAuthList" resultType="UserAuth"> SELECT * FROM user_auth WHERE username = #{username} </select>
XML
๋ณต์‚ฌ
์ด๋ ‡๊ฒŒ resultMap ์œผ๋กœ ์ฐธ์กฐํ•˜์—ฌ JOIN ์„ ํ•˜๋ฉด, ๋‹ค์ค‘์˜ JOIN ์ฟผ๋ฆฌ๋ฅผ ์‰ฝ๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
์—ฌ๊ธฐ์„œ๋Š”, ๊ฒŒ์‹œ๊ธ€ ๋ชฉ๋ก ์กฐํšŒ ์‹œ
โ€ข
board : user = 1 : 1
โ€ข
user : user_auth = 1 : N
์ด๋ ‡๊ฒŒ ๋‹ค์ค‘์œผ๋กœ ๊ณ„์ธต์ ์œผ๋กœ ๊ฒŒ์‹œ๊ธ€ ๋ชฉ๋ก์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.
- BoardMap - UserMap - AuthMap (or selectAuthList)
Plain Text
๋ณต์‚ฌ
Board โ”œโ”€โ”€ no: 1 โ”œโ”€โ”€ id: 67610565-a89b-11ef-a47a-a8a1596f255e โ”œโ”€โ”€ title: ์ œ๋ชฉ1 โ”œโ”€โ”€ userNo: 3 โ”œโ”€โ”€ content: ๋‚ด์šฉ1 โ”œโ”€โ”€ createdAt: Fri Nov 22 15:31:27 KST 2024 โ”œโ”€โ”€ updatedAt: Fri Nov 22 15:31:27 KST 2024 โ”œโ”€โ”€ user: Users โ”‚ โ”œโ”€โ”€ no: 3 โ”‚ โ”œโ”€โ”€ id: 60b8c64d-a89b-11ef-a47a-a8a1596f255e โ”‚ โ”œโ”€โ”€ username: test โ”‚ โ”œโ”€โ”€ password: $2a$12$TrN..KcVjciCiz.5Vj96YOBljeVTTGJ9AUKmtfbGpgc9hmC7BxQ92 โ”‚ โ”œโ”€โ”€ name: ํ…Œ์ŠคํŠธ โ”‚ โ”œโ”€โ”€ email: test@mail.com โ”‚ โ”œโ”€โ”€ createdAt: Fri Nov 22 15:31:16 KST 2024 โ”‚ โ”œโ”€โ”€ updatedAt: Fri Nov 22 15:31:16 KST 2024 โ”‚ โ”œโ”€โ”€ enabled: 1 โ”‚ โ””โ”€โ”€ authList: List<UserAuth> โ”‚ โ””โ”€โ”€ UserAuth โ”‚ โ”œโ”€โ”€ no: 4 โ”‚ โ”œโ”€โ”€ id: 64816228-a89b-11ef-a47a-a8a1596f255e โ”‚ โ”œโ”€โ”€ userNo: 1 โ”‚ โ”œโ”€โ”€ username: test โ”‚ โ”œโ”€โ”€ auth: ROLE_USER โ”‚ โ”œโ”€โ”€ createdAt: Fri Nov 22 15:31:23 KST 2024 โ”‚ โ””โ”€โ”€ updatedAt: Fri Nov 22 15:31:23 KST 2024 โ”œโ”€โ”€ fileList: null โ””โ”€โ”€ deleteFiles: null
Plain Text
๋ณต์‚ฌ