๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Spring

Spring + MyBatis์—์„œ ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ์™€ ๊ฐ์ฒด๊ฐ€ ๋งคํ•‘์ด ๋˜๋Š” ๊ณผ์ •

by ์ฃผ๋ฐœ2 2022. 10. 3.
๋ฐ˜์‘ํ˜•

๐Ÿงท Spring + MyBatis์—์„œ ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ์™€ ๊ฐ์ฒด๊ฐ€ ๋งคํ•‘์ด ๋˜๋Š” ๊ณผ์ •

 

์Šคํ”„๋ง์—์„œ ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, Select ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ์™€ ๊ฐ์ฒด(Dto)๊ฐ€ ์–ด๋– ํ•œ ์ž‘์—…์„ ํ†ตํ•ด ๋งคํ•‘์ด ๋˜๋Š”์ง€ ์ •ํ™•ํ•˜๊ฒŒ ํŒŒ์•…ํ•˜๊ณ  ๊ณต์œ ํ•˜๊ธฐ ์œ„ํ•ด ๋งคํ•‘ ๊ณผ์ •์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

(๋‹น์—ฐํžˆ ํ‹€๋ฆฐ ๋‚ด์šฉ์ด ์กด์žฌํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ ํ”ผ๋“œ๋ฐฑ ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜‚)

 

๐ŸŒˆ ๊ฐœ์š”

  • Spring๊ณผ MyBatis์—์„œ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์™€ ๊ฐ์ฒด์˜ ๋งคํ•‘์ด ์ด๋ฃจ์–ด์ง€๋Š” ๊ณผ์ •์— ๋Œ€ํ•ด ์‚ดํŽด๋ด…๋‹ˆ๋‹ค.
  • ์ด์™€ ๊ด€๋ จํ•˜์—ฌ ์–ด๋– ํ•œ ๋ฐฉ์‹์œผ๋กœ ๋งคํ•‘์„ ์ง„ํ–‰ํ•˜๋Š”์ง€, ์ข‹์€ ๋ฐฉ๋ฒ•์ด ๋ฌด์—‡์ธ์ง€ ๋“ฑ์— ๋Œ€ํ•ด ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

๐Ÿ”– ๊ฒฐ๋ก 

ํฌ์ŠคํŒ…์ด ๊ฝค๋‚˜ ์žฅ๋ฌธ์ด๊ธฐ์—,, ๋งคํ•‘ ๊ณผ์ •์— ๋Œ€ํ•ด ๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋ง์”€๋“œ๋ฆฌ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๊ธฐ๋ณธ ์ƒ์„ฑ์ž(NoArgs)๋งŒ ์กด์žฌํ•  ๊ฒฝ์šฐ, ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์™€ ๊ฐ์ฒด์˜ ๋งคํ•‘์ด ์ •์ƒ์ ์œผ๋กœ ์ง„ํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ •ํ™•ํ•˜๊ฒŒ๋Š” null๋กœ ๋งคํ•‘์ด ๋ฉ๋‹ˆ๋‹ค.
  • ๊ธฐ๋ณธ ์ƒ์„ฑ์ž(NoArgs)์™€ ์ปฌ๋Ÿผ ๋ณ„์นญ(Alias)๊ฐ€ ์กด์žฌํ•  ๊ฒฝ์šฐ ๋งคํ•‘์ด ์ •์ƒ์ ์œผ๋กœ ๋ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ํ•„๋“œ์— ๋Œ€ํ•œ ์ƒ์„ฑ์ž(AllArgs)๊ฐ€ ์กด์žฌํ•˜๋ฉด ๋ณ„์นญ์ด ์—†๋”๋ผ๋„ ๋งคํ•‘์ด ์ •์ƒ์ ์œผ๋กœ ๋ฉ๋‹ˆ๋‹ค.
    • ๋‹จ, ๊ฐ์ฒด์˜ ํ•„๋“œ์™€ ์ปฌ๋Ÿผ์˜ ๋ฐ์ดํ„ฐ ์ˆœ์„œ๊ฐ€ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ธฐ๋ณธ ์ƒ์„ฑ์ž์™€ ๋ชจ๋“  ํ•„๋“œ์— ๋Œ€ํ•œ ์ƒ์„ฑ์ž๊ฐ€ ์•„๋‹Œ, ์ผ๋ถ€ ํ•„๋“œ์— ๋Œ€ํ•œ ์ƒ์„ฑ์ž๋งŒ ์กด์žฌํ•  ๊ฒฝ์šฐ, ํ•ด๋‹น ํ•„๋“œ์— ๋Œ€ํ•ด์„œ๋งŒ ๋ฐ์ดํ„ฐ ๋งคํ•‘์ด ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.
  • No Args, All Args๊ฐ€ ์•„๋‹Œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ƒ์„ฑ์ž๊ฐ€ ์กด์žฌํ•  ๊ฒฝ์šฐ, ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค
  • ๋ฆฌํ”Œ๋ ‰์…˜์œผ๋กœ ์ธํ•ด ๊ฐ์ฒด ํด๋ž˜์Šค์— getter/setter๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

๐Ÿ“ƒ ์˜ˆ์ œ ์ฝ”๋“œ

ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด Dto, Mapper, xml ๋“ฑ์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

(ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉํ•˜์˜€๊ธฐ์— ํ…Œ์ด๋ธ”๋ช…์ด ๋‚˜ ์ปฌ๋Ÿผ, ํ•„๋“œ๋ช… ๋“ฑ์€ ์ž„์˜๋กœ ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค ^^;)

 

TestDto ๊ฐ์ฒด

1
2
3
4
5
6
7
8
9
10
11
public class TestDto {
 
    private String id;
    private Long promotionId;
    private Long itemId;
    private String type;
    private String expiredStartDate;
    private String expiredEndDate;
    private String useYn;
 
}
cs

Mapper ์ธํ„ฐํŽ˜์ด์Šค

1
2
3
4
5
6
7
8
9
10
11
12
13
// Alias๊ฐ€ ์„ค์ •๋œ Mapper
@Mapper
public interface AliasMapper {
    List<TestDto> findAll();
}
 
 
// Alias๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์€ Mapper
@Mapper
public interface NoAliasMapper {
    List<TestDto> findAll();
}
   
cs

Mapper.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
-- NoAliasMapper.xml
<?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.example.mybatisbinding.mapper.NoAliasMapper" >
    <select id="findAll" resultType="TestDto">
        SELECT
            MC_ID
             , P_ID
             , ITEM_ID
             , MC_FG
             , YH_S_YMD
             , YH_E_YMD
             , USE_YN
        FROM
            TEST_TABLE
        WHERE
            MC_ID IN ('5716', '5717') -- 2๊ฑด์˜ ๋ฐ์ดํ„ฐ ์กด์žฌ
    </select>
</mapper>
   
 
-- AliasMapper.xml
<?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.example.mybatisbinding.mapper.AliasMapper" >
    <select id="findAll" resultType="TestDto">
        SELECT
            MC_ID AS id
             , P_ID AS promotionId
             , ITEM_ID AS itemId
             , MC_FG AS type
             , YH_E_YMD AS expiredEndDate
             , YH_S_YMD AS expiredStartDate
             , USE_YN AS useYn
        FROM
            TEST_TABLE
        WHERE
            MC_ID IN ('5716', '5717') -- 2๊ฑด์˜ ๋ฐ์ดํ„ฐ ์กด์žฌ
    </select>
</mapper>
cs
  • AliasMapper.xml ์˜ ๊ฒฝ์šฐ TestDto ๊ฐ์ฒด์˜ ํ•„๋“œ๋ช…๊ณผ ๋™์ผํ•˜๊ฒŒ alias ์„ค์ •์„ ํ•ฉ๋‹ˆ๋‹ค.
  • xml ํŒŒ์ผ์˜ resultType์—์„œ ํŒจํ‚ค์ง€ ๊ฒฝ๋กœ๋ฅผ ์ œ์™ธํ•œ ํด๋ž˜์Šค๋ช…๋งŒ ์ž‘์„ฑํ•œ ๊ฒƒ์€ properties(yml) ํŒŒ์ผ์— ์•„๋ž˜ ์„ค์ •์„ ํ†ตํ•ด dto ํŒŒ์ผ์ด ์กด์žฌํ•˜๋Š” ํŒจํ‚ค์ง€ ๊ฒฝ๋กœ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์„ ์–ธํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
mybatis.type-aliases-package: com.example.mybatisbinding.dto

 

๐Ÿ“Œ ํ…Œ์ŠคํŠธ

์ƒ์„ฑ์ž ๋ฐ alias์˜ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์กฐํ•ฉ์„ ํ†ตํ•ด ํ…Œ์ŠคํŠธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 

(๋ฐ‘์—์„œ ์ž์„ธํžˆ ์„ค๋ช…๋“œ๋ฆฌ๊ฒ ์ง€๋งŒ, TestDto ๊ฐ์ฒด์—์„œ getter/setter๋Š” ๋”ฐ๋กœ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)

  1. ๊ธฐ๋ณธ ์ƒ์„ฑ์ž(@NoArgsConstructor)
  2. ๊ธฐ๋ณธ ์ƒ์„ฑ์ž(@NoArgsConstructor) + ๋ณ„์นญ(Alias)
  3. ๋ชจ๋“  ํ•„๋“œ๋ฅผ ํฌํ•จํ•˜๋Š” ์ƒ์„ฑ์ž(@AllArgsConstructor)
  4. ๊ธฐ๋ณธ ์ƒ์„ฑ์ž + ๋ชจ๋“  ํ•„๋“œ๋ฅผ ํฌํ•จํ•˜๋Š” ์ƒ์„ฑ์ž(@NoArgs + @AllArgs)
  5. ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ƒ์„ฑ์ž๊ฐ€ ์กด์žฌํ•  ๊ฒฝ์šฐ
  6. ์ผ๋ถ€ ํ•„๋“œ๋ฅผ ๊ฐ€์ง€๋Š” ๋‹จ ํ•˜๋‚˜์˜ ์ƒ์„ฑ์ž๋งŒ ์กด์žฌํ•  ๊ฒฝ์šฐ

 

ํŽธ์˜๋ฅผ ์œ„ํ•ด ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋Š” @NoArgs๋กœ, ๋ชจ๋“  ํ•„๋“œ๋ฅผ ํฌํ•จํ•˜๋Š” ์ƒ์„ฑ์ž๋Š” @AllArgs๋กœ, ๋ณ„์นญ์€ Alias๋กœ ํ‘œ๊ธฐํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

1. ๊ธฐ๋ณธ ์ƒ์„ฑ์ž(@NoArgs)

  • ๊ฐ์ฒด(TestDto)์— @NoArgs๋งŒ ์กด์žฌํ•  ๊ฒฝ์šฐ, ๊ฐ์ฒด์˜ ๋งคํ•‘์ด ์ •์ƒ์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • ์ข€ ๋” ์ •ํ™•ํ•˜๊ฒŒ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ null๋กœ ๋งคํ•‘์ด ๋ฉ๋‹ˆ๋‹ค. 
    • ์˜ˆ๋ฅผ ๋“ค์–ด, ์กฐํšŒ ๊ฒฐ๊ณผ๊ฐ€ 10๊ฑด์ธ ๊ฒฝ์šฐ, 10๊ฐœ์˜ ๊ฐ์ฒด์— ๋Œ€ํ•œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ null๋กœ ๋งคํ•‘๋ฉ๋‹ˆ๋‹ค.
  • Java์˜ ๊ฒฝ์šฐ, ์ƒ์„ฑ์ž๋ฅผ ๋ช…์‹œํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ์ž๋™์ ์œผ๋กœ ๋””ํดํŠธ ์ƒ์„ฑ์ž๊ฐ€ ์กด์žฌํ•˜์ง€๋งŒ, ๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด ๋ช…์‹œ์ ์œผ๋กœ ์„ ์–ธํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.
1
2
3
4
5
6
7
8
9
10
11
@NoArgsConstructor
public class TestDto {
 
    private String id;
    private Long promotionId;
    private Long itemId;
    private String type;
    private String expiredStartDate;
    private String expiredEndDate;
    private String useYn;
}
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
    @DisplayName("๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋งŒ ์กด์žฌํ•  ๊ฒฝ์šฐ ๋ฐ”์ธ๋”ฉ์ด ์ •์ƒ์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š๋Š”๋‹ค.")
    @Test
    void givenNoArgsBinding_isNull() {
        final int expected = 2;
 
        List<TestDto> dtoList = noAliasMapper.findAll();
 
        SoftAssertions.assertSoftly(softly -> {
            softly.assertThat(dtoList).hasSize(expected);
            softly.assertThat(dtoList.get(0)).isNull();
            softly.assertThat(dtoList.get(1)).isNull();
        });
    }
cs

 

2. ๊ธฐ๋ณธ ์ƒ์„ฑ์ž(@NoArgs) + ๋ณ„์นญ(Alias)

  • 1)์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž์™€ ์ปฌ๋Ÿผ Alias๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ, ์กฐํšŒ ๊ฒฐ๊ณผ์™€ ๊ฐ์ฒด ๊ฐ„ ๋ฐ์ดํ„ฐ ๋งคํ•‘์ด ์ •์ƒ์ ์œผ๋กœ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
-- AliasMapper.xml
<?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.example.mybatisbinding.mapper.AliasMapper" >
    <select id="findAll" resultType="TestDto">
        SELECT
            MC_ID AS id
             , P_ID AS promotionId
             , ITEM_ID AS itemId
             , MC_FG AS type
             , YH_E_YMD AS expiredEndDate
             , YH_S_YMD AS expiredStartDate
             , USE_YN AS useYn
        FROM
            TEST_TABLE
        WHERE
            MC_ID IN ('5716', '5717') -- 2๊ฑด์˜ ๋ฐ์ดํ„ฐ ์กด์žฌ
    </select>
</mapper>
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
    @DisplayName("๊ธฐ๋ณธ ์ƒ์„ฑ์ž์™€ alias์ด ์กด์žฌํ•  ๊ฒฝ์šฐ ๋ฐ”์ธ๋”ฉ์ด ์ •์ƒ์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.")
    @Test
    void givenNoArgsBindingWithAlias_isNotNull() {
        final int expected = 2;
 
        List<TestDto> dtoList = aliasMapper.findAll();
 
        SoftAssertions.assertSoftly(softly -> {
            softly.assertThat(dtoList).hasSize(expected);
            softly.assertThat(dtoList.get(0)).isNotNull();
            softly.assertThat(dtoList.get(1)).isNotNull();
        });
    }
cs

  • ์ฐธ๊ณ ๋กœ alias์˜ ๊ฒฝ์šฐ ์ปฌ๋Ÿผ์˜ ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜์ง€ ์•Š๊ธฐ์— ๋ณ„์นญ(alias)๋งŒ ๊ฐ์ฒด์˜ ํ•„๋“œ๋ช…๊ณผ ๋™์ผํ•˜๋‹ค๋ฉด, ์ˆœ์„œ๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

3. ๋ชจ๋“  ํ•„๋“œ๋ฅผ ํฌํ•จํ•˜๋Š” ์ƒ์„ฑ์ž(@AllArgs)

  • ๊ฐ์ฒด์— ๋ชจ๋“  ํ•„๋“œ๊ฐ€ ํฌํ•จ๋œ ์ƒ์„ฑ์ž๊ฐ€ ์กด์žฌํ•  ๊ฒฝ์šฐ(@AllArgs) ์กฐํšŒ ๊ฒฐ๊ณผ์™€ ๊ฐ์ฒด ๊ฐ„ ๋ฐ์ดํ„ฐ ๋งคํ•‘์ด ์ •์ƒ์ ์œผ๋กœ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.
1
2
3
4
5
6
7
8
9
10
11
@AllArgsConstructor
public class TestDto {
 
    private String id;
    private Long promotionId;
    private Long itemId;
    private String type;
    private String expiredStartDate;
    private String expiredEndDate;
    private String useYn;
}
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?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.example.mybatisbinding.mapper.NoAliasMapper" >
    <select id="findAll" resultType="TestDto">
        SELECT
            MC_ID
             , P_ID
             , ITEM_ID
             , MC_FG
             , YH_S_YMD
             , YH_E_YMD
             , USE_YN
        FROM
            TEST_TABLE
        WHERE
            MC_ID IN ('5716', '5717') -- 2๊ฑด์˜ ๋ฐ์ดํ„ฐ ์กด์žฌ
    </select>
</mapper>
cs
  • @AllArgs์˜ ๊ฒฝ์šฐ ์ปฌ๋Ÿผ ์ˆœ์„œ๋Œ€๋กœ ํ•„๋“œ์™€ ๋งคํ•‘์ด ๋˜๊ธฐ์— ์ปฌ๋Ÿผ๊ณผ ํ•„๋“œ์˜ ์ˆœ์„œ๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
    @DisplayName("๋ชจ๋“  ํ•„๋“œ์˜ ์ƒ์„ฑ์ž๊ฐ€ ์กด์žฌํ•  ๊ฒฝ์šฐ ๋ฐ”์ธ๋”ฉ์ด ์ •์ƒ์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.")
    @Test
    void givenAllArgsBinding_isNotNull() {
        final int expected = 2;
 
        List<TestDto> dtoList = noAliasMapper.findAll();
 
        SoftAssertions.assertSoftly(softly -> {
            softly.assertThat(dtoList).hasSize(expected);
            softly.assertThat(dtoList.get(0)).isNotNull();
            softly.assertThat(dtoList.get(1)).isNotNull();
        });
    }
cs

3-1. ๊ฐ์ฒด์˜ ํ•„๋“œ์™€ ์ปฌ๋Ÿผ ์ˆœ์„œ๊ฐ€ ๋‹ค๋ฅผ ๊ฒฝ์šฐ → ์›ํ•˜์ง€ ์•Š๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?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.example.mybatisbinding.mapper.NoAliasMapper" >
    <select id="findAll" resultType="TestDto">
        SELECT
            MC_ID
             , P_ID
             , ITEM_ID
             , MC_FG
             , YH_S_YMD
             , USE_YN  -- YH_E_YMD ์ปฌ๋Ÿผ๊ณผ ์ˆœ์„œ๊ฐ€ ๋ฐ”๋€œ
             , YH_E_YMD
        FROM
            TEST_TABLE
        WHERE
            MC_ID IN ('5716', '5717') -- 2๊ฑด์˜ ๋ฐ์ดํ„ฐ ์กด์žฌ
    </select>
</mapper>  
cs

  • USE_YN์˜ ์ปฌ๋Ÿผ๊ณผ YH_E_YMD ์ปฌ๋Ÿผ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋€Œ์–ด ๊ฐ์ฒด์™€ ๋งคํ•‘์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. 
    • ์ปฌ๋Ÿผ์˜ ํƒ€์ž…์ด ๋‹ค๋ฅธ ๊ฒฝ์šฐ์—” SQLException ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

 

4. ๊ธฐ๋ณธ ์ƒ์„ฑ์ž + ๋ชจ๋“  ํ•„๋“œ๋ฅผ ํฌํ•จํ•˜๋Š” ์ƒ์„ฑ์ž(@NoArgs + @AllArgs)

  • @AllArgs ์–ด๋…ธํ…Œ์ด์…˜์ด ์กด์žฌํ•  ๊ฒฝ์šฐ, ๋””ํดํŠธ ์ƒ์„ฑ์ž์˜ ์—ฌ๋ถ€๋Š” ์ƒ๊ด€์—†์ด ๋งคํ•‘์ด ์ •์ƒ์ ์œผ๋กœ ๋ฉ๋‹ˆ๋‹ค.
1
2
3
4
5
6
7
8
9
10
11
12
@NoArgsConstructor
@AllArgsConstructor
public class TestDto {
 
    private String id;
    private Long promotionId;
    private Long itemId;
    private String type;
    private String expiredStartDate;
    private String expiredEndDate;
    private String useYn;
}
cs
1
2
3
4
5
6
7
8
9
10
11
12
13
@DisplayName("๊ธฐ๋ณธ ์ƒ์„ฑ์ž์™€ ๋ชจ๋“  ํ•„๋“œ์˜ ์ƒ์„ฑ์ž๊ฐ€ ์กด์žฌํ•  ๊ฒฝ์šฐ ๋ฐ”์ธ๋”ฉ์ด ์ •์ƒ์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.")
@Test
void givenNoArgsAndAllArgs_isNotNull() {
    final int expected = 2;
 
    List<TestDto> dtoList = mapper.findAll();
 
    SoftAssertions.assertSoftly(softly -> {
        softly.assertThat(dtoList).hasSize(expected);
        softly.assertThat(dtoList.get(0)).isNotNull();
        softly.assertThat(dtoList.get(1)).isNotNull();
    });
}
cs

 

5. ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ƒ์„ฑ์ž๊ฐ€ ์กด์žฌํ•  ๊ฒฝ์šฐ

์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ƒ์„ฑ์ž๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ @NoArgs์™€ @AllArgs๊ฐ€ ์กด์žฌํ•˜๋ƒ ์•„๋‹ˆ๋ƒ์— ๋”ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

  • ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋Š” ์กด์žฌํ•˜๋‚˜ alias๊ฐ€ ์—†์„ ๊ฒฝ์šฐ - null๋กœ ๋งคํ•‘
  • ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ - alias ์—ฌ๋ถ€์™€ ์ƒ๊ด€์—†์ด ์–ด๋– ํ•œ ์ƒ์„ฑ์ž๋ฅผ ์„ ํƒํ•ด์•ผ ํ• ์ง€ ์•Œ ์ˆ˜ ์—†๊ธฐ์— ์˜ค๋ฅ˜ ๋ฐœ์ƒ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// ๊ธฐ๋ณธ ์ƒ์„ฑ์ž์™€ ๋ชจ๋“  ํ•„๋“œ๋ฅผ ๊ฐ€์ง„ ์ƒ์„ฑ์ž๊ฐ€ ์•„๋‹Œ, ์—ฌ๋Ÿฌ ์ƒ์„ฑ์ž๊ฐ€ ์กด์žฌํ•  ๊ฒฝ์šฐ -> Exception ๋ฐœ์ƒ
@ToString
public class TestDto {
 
    private String id;
    private Long promotionId;
    private Long itemId;
    private String type;
    private String expiredStartDate;
    private String expiredEndDate;
    private String useYn;
 
    public TestDto(String id) {
        this.id = id;
    }
 
    public TestDto(String id, Long promotionId) {
        this.id = id;
        this.promotionId = promotionId;
    }
}
cs

 

6. ์ผ๋ถ€ ํ•„๋“œ๋ฅผ ๊ฐ€์ง€๋Š” ๋‹จ ํ•˜๋‚˜์˜ ์ƒ์„ฑ์ž๋งŒ ์กด์žฌํ•  ๊ฒฝ์šฐ

  • alias ์„ค์ •์ด ์—†๋Š” ๊ฒฝ์šฐ: ์ƒ์„ฑ์ž์— ์กด์žฌํ•˜๋Š” ํ•„๋“œ๋งŒ ๋งคํ•‘์ด ๋ฉ๋‹ˆ๋‹ค.
  • alias ์„ค์ •์ด ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ: ๋ชจ๋“  ํ•„๋“œ์— ๋Œ€ํ•ด ์ •์ƒ์ ์œผ๋กœ ๋งคํ•‘์ด ๋ฉ๋‹ˆ๋‹ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@ToString
public class TestDto {
 
    private String id;
    private Long promotionId;
    private Long itemId;
    private String type;
    private String expiredStartDate;
    private String expiredEndDate;
    private String useYn;
 
    public TestDto(String id, Long promotionId) {
        this.id = id;
        this.promotionId = promotionId;
    }
 
}
cs

 

1
2
3
4
5
6
7
@DisplayName("์ผ๋ถ€ ํ•„๋“œ๋งŒ ๊ฐ€์ง„ ์ƒ์„ฑ์ž๊ฐ€ ์กด์žฌํ•˜๊ณ , alias ์„ค์ •์ด ์—†์„ ๊ฒฝ์šฐ, ์ผ๋ถ€ ํ•„๋“œ์— ๋Œ€ํ•ด์„œ๋งŒ ๋งคํ•‘์ด ๋œ๋‹ค.")
@Test
void givenSomeFieldArgsWithNoAlias_isOnlySomeFieldsBinding() {
    List<TestDto> dtoList = aliasMapper.findAll();
 
    System.out.println(dtoList);
}
cs

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
@DisplayName("์ผ๋ถ€ ํ•„๋“œ๋งŒ ๊ฐ€์ง„ ์ƒ์„ฑ์ž๊ฐ€ ์กด์žฌํ•˜๊ณ , alias ์„ค์ •์ด ๋œ ๊ฒฝ์šฐ, ๋ชจ๋“  ํ•„๋“œ๊ฐ€ ๋งคํ•‘๋œ๋‹ค.")
@Test
void givenSomeFiledWithAlias_isNotNull() {
    List<TestDto> dtoList = aliasMapper.findAll();
 
    System.out.println(dtoList);
 
    SoftAssertions.assertSoftly(softly -> {
        softly.assertThat(dtoList).hasSize(expected);
        softly.assertThat(dtoList.get(0)).isNotNull();
        softly.assertThat(dtoList.get(1)).isNotNull();
    });
}
cs

 

์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ํ† ๋Œ€๋กœ ์ •๋ฆฌํ•ด ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ๋Š” ๋ฐ”์ธ๋”ฉ์ด ์ •์ƒ์ ์œผ๋กœ ์ง„ํ–‰์ด ๋ฉ๋‹ˆ๋‹ค.

  • ๊ธฐ๋ณธ ์ƒ์„ฑ์ž์™€ ๋ณ„์นญ(alias)์ด ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ (@NoArgs + alias)
  • ๋ชจ๋“  ํ•„๋“œ๋ฅผ ๊ฐ€์ง€๋Š” ์ƒ์„ฑ์ž๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ (@AllArgs)
  • ์ƒ์„ฑ์ž๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์กด์žฌํ•˜๋”๋ผ๋„, ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๊ฐ€ ์กด์žฌํ•˜๊ณ  alias๊ฐ€ ์„ค์ •๋œ ๊ฒฝ์šฐ

์ •๋ฆฌํ•ด ๋ณด๋ฉด, @AllArgs๊ฐ€ ์กด์žฌํ•˜๊ฑฐ๋‚˜ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ํฌํ•จํ•˜์—ฌ ๋ณ„์นญ(Alias)๋งŒ ๊ฐ์ฒด ํ•„๋“œ์™€ ๋™์ผํ•˜๋‹ค๋ฉด, ์ƒ์„ฑ์ž์˜ ๊ฐœ์ˆ˜์™€๋Š” ์ƒ๊ด€์—†์ด ๋งคํ•‘์ด ์ •์ƒ์ ์œผ๋กœ ๋ฉ๋‹ˆ๋‹ค.

 

๊ฐœ์ธ์ ์ธ ์ƒ๊ฐ์œผ๋กœ @AllArgs๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹จ์ ์ด ์กด์žฌํ•˜๊ธฐ์— @NoArgs + Alias ์กฐํ•ฉ์œผ๋กœ ๋ฐ”์ธ๋”ฉ ํ•˜๋Š” ๊ฒŒ ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์•„๋‹๊นŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
(์•„๋ž˜ ์˜๊ฒฌ์€ ํŒ€์›๋ถ„๊ป˜์„œ ์ฃผ์‹  ์˜๊ฒฌ์ž…๋‹ˆ๋‹ค. ๐Ÿ™‡‍โ™‚๏ธ)

  • ์กฐํšŒ ๊ฒฐ๊ณผ๊ฐ’์ด ์–ด๋–ค ํ•„๋“œ์— ๋งคํ•‘๋˜์–ด ์žˆ๋Š”์ง€ ํ•˜๋‚˜ํ•˜๋‚˜ ๋น„๊ตํ•˜์ง€ ์•Š์œผ๋ฉด ํŒŒ์•…์ด ํž˜๋“ค๋‹ค.
  • ์ถ”ํ›„ ์ปฌ๋Ÿผ์ด๋‚˜ ์ฝ”๋“œ์˜ ๋ณ€๊ฒฝ ์‹œ @AllArgs๋Š” ์ปฌ๋Ÿผ ์ˆœ์„œ๋ฅผ ์‹ ๊ฒฝ ์จ์•ผ ํ•˜๋ฏ€๋กœ ์œ ์ง€ ๋ณด์ˆ˜ ๋ฉด์—์„œ ๋น„์šฉ์ด ๋” ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
  • alias๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด์˜ ํ•„๋“œ์™€ ์ปฌ๋Ÿผ์˜ ์ˆœ์„œ๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š๋”๋ผ๋„ ์–ด๋– ํ•œ ํ•„๋“œ๊ฐ€ ๋งคํ•‘๋˜๋Š”์ง€ ๋ฐ”๋กœ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ๋Ÿผ ์‹ค์ œ ๋‚ด๋ถ€์ ์œผ๋ก  ์–ด๋– ํ•œ ๋ฐฉ์‹์œผ๋กœ ์กฐํšŒ ๊ฒฐ๊ณผ์™€ ๊ฐ์ฒด๊ฐ€ ๋ฐ”์ธ๋”ฉ์ด ๋˜๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

โœ๏ธ ๋งคํ•‘ ๊ณผ์ •

getter/setter์˜ ํ•„์š”์„ฑ?

์œ„์—์„œ ๊ฐ์ฒด ํด๋ž˜์Šค์— getter/setter๊ฐ€ ํ•„์š” ์—†๋‹ค๊ณ  ๋ง์”€๋“œ๋ ธ๋Š”๋ฐ์š”, ์ด๋Š” ๋ฆฌํ”Œ๋ ‰์…˜์„ ์ด์šฉํ•˜์—ฌ getter/setter๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋”๋ผ๋„ ์„ค์ •์„ ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

Reflector Class

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Reflector {
...
 
  public Reflector(Class<?> clazz) {
    type = clazz;
    addDefaultConstructor(clazz);
    Method[] classMethods = getClassMethods(clazz);
    addGetMethods(classMethods); // getter ๋ฉ”์„œ๋“œ ๋Œ€์ƒ์œผ๋กœ ์ •๋ณด ์ทจํ•ฉ
    addSetMethods(classMethods); // setter ๋ฉ”์„œ๋“œ ๋Œ€์ƒ์œผ๋กœ ์ •๋ณด ์ทจํ•ฉ
    addFields(clazz); // field ๋Œ€์ƒ์œผ๋กœ ์ •๋ณด ์ทจํ•ฉ
    readablePropertyNames = getMethods.keySet().toArray(new String[0]);
    writablePropertyNames = setMethods.keySet().toArray(new String[0]);
    for (String propName : readablePropertyNames) {
      caseInsensitivePropertyMap.put(propName.toUpperCase(Locale.ENGLISH), propName); // ๋Œ€๋ฌธ์ž ์„ค์ •
    }
    for (String propName : writablePropertyNames) {
      caseInsensitivePropertyMap.put(propName.toUpperCase(Locale.ENGLISH), propName); // ๋Œ€๋ฌธ์ž ์„ค์ •
    }
  }
cs

TestDto ํด๋ž˜์Šค์—๋Š” private ํ•„๋“œ๋งŒ ์กด์žฌํ•  ๋ฟ getter์™€ setter๊ฐ€ ๋”ฐ๋กœ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋ฐ์š”, ์ด๋Š” ๋ฆฌํ”Œ๋ ‰์…˜(Reflector)์„ ์ด์šฉํ•˜์—ฌ resultType์˜ ํด๋ž˜์Šค์— ๋Œ€ํ•œ ํ•„๋“œ ์ •๋ณด ๋ฐ getter, setter์˜ ๋งคํ•‘ ์ •๋ณด๋ฅผ ์ƒ์„ฑํ•ด๋‘๊ธฐ ๋•Œ๋ฌธ์— ๋”ฐ๋กœ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

  • ์œ„ ์ฝ”๋“œ๋Š” Reflector ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž์ž…๋‹ˆ๋‹ค.
  • getter์™€ setter์— ๋Œ€ํ•œ ๋ฉ”์„œ๋“œ๊ฐ€ ์กด์žฌํ•˜๋ฉด, addGetMethods(), addSetMethods() ๋ฉ”์„œ๋“œ์—์„œ getter/setter ์ฒ˜๋ฆฌ๋ฅผ ๋จผ์ € ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ๋งŒ์•ฝ getter, setter ์ •๋ณด๊ฐ€ ์—†๋‹ค๋ฉด addFields() ๋ฉ”์„œ๋“œ์—์„œ ํ•„๋“œ ์ •๋ณด๋ฅผ ํ† ๋Œ€๋กœ getter/setter๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค๊ธฐ์— ํด๋ž˜์Šค์— getter/setter๋ฅผ ์„ ์–ธํ•ด ์ฃผ์ง€ ์•Š์•„๋„ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋˜ํ•œ ์ปฌ๋Ÿผ๊ณผ ํ•„๋“œ์˜ ๋Œ€์†Œ๋ฌธ์ž๊ฐ€ ๋‹ค๋ฅด๋”๋ผ๋„ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋ฐ์š”, ์ด๋Š” ์œ„ ์ฝ”๋“œ์—์„œ toUpperCase() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋Œ€๋ฌธ์ž๋กœ ๋ชจ๋‘ ๋ณ€๊ฒฝํ•ด๋ฒ„๋ฆฌ๊ธฐ์— ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

Reflector - addGetMethods(), addSetMethods(), addFields()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
public class Reflector {
...
 
    // ๋ฉ”์„œ๋“œ๋ฅผ ํ† ๋Œ€๋กœ getter ์„ค์ •
    private void addGetMethods(Method[] methods) {
        Map<String, List<Method>> conflictingGetters = new HashMap<>();
        Arrays.stream(methods)
                .filter(m -> m.getParameterTypes().length == 0 && PropertyNamer.isGetter(m.getName()))
                .forEach(m -> addMethodConflict(conflictingGetters, PropertyNamer.methodToProperty(m.getName()), m));
        resolveGetterConflicts(conflictingGetters);
    }
 
...
 
    // ๋ฉ”์„œ๋“œ๋ฅผ ํ† ๋Œ€๋กœ setter ์„ค์ •
    private void addSetMethods(Method[] methods) {
        Map<String, List<Method>> conflictingSetters = new HashMap<>();
        Arrays.stream(methods)
                .filter(m -> m.getParameterTypes().length == 1 && PropertyNamer.isSetter(m.getName()))
                .forEach(m -> addMethodConflict(conflictingSetters, PropertyNamer.methodToProperty(m.getName()), m));
        resolveSetterConflicts(conflictingSetters);
    }
 
...
 
    // ํ•„๋“œ๋ฅผ ํ† ๋Œ€๋กœ getter/setter ์„ค์ •
    private void addFields(Class<?> clazz) {
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            if (!setMethods.containsKey(field.getName())) {
                // issue #379 - removed the check for final because JDK 1.5 allows
                // modification of final fields through reflection (JSR-133). (JGB)
                // pr #16 - final static can only be set by the classloader
                int modifiers = field.getModifiers();
                if (!(Modifier.isFinal(modifiers) && Modifier.isStatic(modifiers))) {
                    addSetField(field);
                }
            }
            if (!getMethods.containsKey(field.getName())) {
                addGetField(field);
            }
        }
        if (clazz.getSuperclass() != null) {
            addFields(clazz.getSuperclass());
        }
    }
cs

 

ํ…Œ์ŠคํŠธ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์•„๋ž˜ ์ผ€์ด์Šค์— ๋Œ€ํ•ด ๋งคํ•‘๋˜๋Š” ๊ณผ์ •์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜ƒ

  1. ๊ธฐ๋ณธ ์ƒ์„ฑ์ž(@NoArgsConstructor)
  2. ๊ธฐ๋ณธ ์ƒ์„ฑ์ž(@NoArgsConstructor) + ๋ณ„์นญ(Alias)
  3. ๋ชจ๋“  ํ•„๋“œ๋ฅผ ํฌํ•จํ•˜๋Š” ์ƒ์„ฑ์ž(@AllArgsConstructor)
  4. ๊ธฐ๋ณธ ์ƒ์„ฑ์ž + ๋ชจ๋“  ํ•„๋“œ๋ฅผ ํฌํ•จํ•˜๋Š” ์ƒ์„ฑ์ž(@NoArgs + @AllArgs)
  5. ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ƒ์„ฑ์ž๊ฐ€ ์กด์žฌํ•  ๊ฒฝ์šฐ
  6. ์ผ๋ถ€ ํ•„๋“œ๋ฅผ ๊ฐ€์ง€๋Š” ๋‹จ ํ•˜๋‚˜์˜ ์ƒ์„ฑ์ž๋งŒ ์กด์žฌํ•  ๊ฒฝ์šฐ

 

1. ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋งŒ ์กด์žฌํ•  ๋•Œ ๋งคํ•‘๋˜๋Š” ๊ณผ์ •

MyBatis์˜ Mapper๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ๋•Œ, ResultSetHandler์˜ ๊ตฌํ˜„์ฒด์ธ DefaultResultSetHandler ํด๋ž˜์Šค์—์„œ ์กฐํšŒ ๋ฐ ๋งคํ•‘ ์ฒ˜๋ฆฌ๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • ์œ„์™€ ๊ฐ™์ด DefaultResultSetHandler ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž์—์„œ ์ฟผ๋ฆฌ ์‹คํ–‰๊ณผ ๊ด€๋ จ๋œ ์—ฌ๋Ÿฌ ์„ค์ •๋“ค์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • ์บ์‹ฑ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ •๋ณด, offset, limit, ์ฟผ๋ฆฌ ์ •๋ณด, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํƒ€์ž… ์ •๋ณด, ๋งคํ•‘ํ•˜๋ ค๋Š” ๊ฐ์ฒด์˜ ํด๋ž˜์Šค ์ •๋ณด ๋“ฑ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.
  • DefaultResultSetHandler ํด๋ž˜์Šค ์ดˆ๊ธฐํ™” ํ›„ ์—ฌ๋Ÿฌ ๊ณผ์ •์„ ๊ฑฐ์ณ getRowValue() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

 

DefaultResultSetHandler - getRowValue()

  • getRowValue() ๋ฉ”์„œ๋“œ์—์„œ ์‹ค์ œ ๋ฐ์ดํ„ฐ(Object)๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ถ€๋ถ„์€ 398๋ผ์ธ์˜ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

 

 

DefaultResultSetHandler - createResultObject()

  • ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๊ฐ€ ์กด์žฌํ•  ๊ฒฝ์šฐ, ์œ„ ์‚ฌ์ง„์—์„œ 656๋ผ์ธ์˜ objectFactory.create() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.

 

DefaultObjectFactory - create()

  • ๊ธฐ๋ณธ ์ƒ์„ฑ์ž์ธ ๊ฒฝ์šฐ, ์ตœ์ดˆ 44๋ผ์ธ์˜ create() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š”๋ฐ์š”, constructorArgTypes์™€ constructorArgs๊ฐ€ null์ธ ์ƒํƒœ๋กœ 50 ๋ผ์ธ์˜ create() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ ํ›„ instantiateClass() ๋ฉ”์„œ๋“œ์—์„œ ์ƒ์„ฑ์ž ์ธ์ž์™€ ๊ด€๋ จ๋œ ๊ฐ’๋“ค์ด ๋ชจ๋‘ null์ด๊ธฐ ๋•Œ๋ฌธ์— 62๋ผ์ธ์˜ constructor.newInstance() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค..
    • ๊ฒฐ๊ตญ ์ƒ์„ฑ์ž์˜ ์ •๋ณด๊ฐ€ ์•„๋ฌด๊ฒƒ๋„ ์กด์žฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ์ฒด์˜ ๋ชจ๋“  ํ•„๋“œ๊ฐ€ null์ธ ์ƒํƒœ๋กœ ๋ฆฌํ„ด์ด ๋ฉ๋‹ˆ๋‹ค.

 

2. ๊ธฐ๋ณธ ์ƒ์„ฑ์ž์™€ alias๊ฐ€ ์กด์žฌํ•  ๋•Œ

๊ธฐ๋ณธ ์ƒ์„ฑ์ž์™€ alias๊ฐ€ ์กด์žฌํ•˜๋”๋ผ๋„ 2. ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋งŒ ์กด์žฌํ•  ๋•Œ์™€ ๋™์ผํ•œ ์ด์œ ๋กœ resultObject ๋ฐ์ดํ„ฐ๋Š” ๋ชจ๋‘ null๋กœ ๋งคํ•‘์ด ๋˜์ง€๋งŒ, ์ดํ›„ ์ฒ˜๋ฆฌ ๊ณผ์ •์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

 

DefaultResultSetHandler - getRowValue()

  • ์œ„ ์ฝ”๋“œ์—์„œ applyAutomaticMappings() ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ alias๊ฐ€ ์กด์žฌํ•  ๊ฒฝ์šฐ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  • applyAutomaticMappings() ๋ฉ”์„œ๋“œ์— ์˜ํ•ด ์ปฌ๋Ÿผ alias๊ฐ€ ์ ์šฉ๋  ๊ฒฝ์šฐ ์ •์ƒ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ๋งคํ•‘์ด ๋˜๋Š”๋ฐ์š”, ํ•ด๋‹น ๋ฉ”์„œ๋“œ์—์„œ autoMapping์˜ ์ž‘์—…์ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

 

  • ์œ„ ์‚ฌ์ง„์—์„œ ์ขŒ์ธก์ด alias๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์ด๊ณ , ์šฐ์ธก์ด alias๊ฐ€ ์„ค์ •๋œ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ alias๋กœ ์ธํ•ด ์ปฌ๋Ÿผ ๋„ค์ž„๊ณผ TestDto ๊ฐ์ฒด์˜ ํ•„๋“œ๊ฐ€ ๋Œ€๋ฌธ์ž๋กœ ๋™์ผํ•˜๊ฒŒ ์„ค์ •์ด ๋˜๊ณ , ์ดํ›„ autoMapping ๋ฆฌ์ŠคํŠธ์— ์ปฌ๋Ÿผ์ •๋ณด๋ฅผ ๋ชจ๋‘ add ํ•ฉ๋‹ˆ๋‹ค. (541 ๋ผ์ธ)

 

  • ๊ทธ ํ›„ autoMapping์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๊ณ  ๊ฐ์ฒด์˜ ๋งคํ•‘์ด ์ด๋ฃจ์–ด์ง€๋Š”๋ฐ์š”, ์œ„์™€ ๊ฐ™์€ ๊ณผ์ •์„ ํ†ตํ•ด alias๊ฐ€ ์„ค์ •๋œ ๊ฒฝ์šฐ ์ตœ์ดˆ resultObject๋Š” null์ด์ง€๋งŒ autoMapping์„ ํ†ตํ•ด ์‹ค์ œ์ ์œผ๋กœ๋Š” ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ’๊ณผ ๋งคํ•‘์ด ๋ฉ๋‹ˆ๋‹ค.

 

3, 4. ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ

์ด๋Ÿฌํ•œ ์ผ€์ด์Šค๋Š” ์œ„์˜ 2. ๊ธฐ๋ณธ ์ƒ์„ฑ์ž ํ˜น์€ ๊ธฐ๋ณธ 3. ์ƒ์„ฑ์ž + alias๊ฐ€ ์กด์žฌํ•  ๋•Œ์™€ ๋‹ค๋ฅด๊ฒŒ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

DefaultResultSetHandler ํด๋ž˜์Šค์—์„œ getRowValue() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฑด ๋™์ผํ•˜์ง€๋งŒ, ์ดํ›„ createResultObject() ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์‹œ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

  • ์œ„ ์ฝ”๋“œ์—์„œ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๊ฐ€ ์กด์žฌํ•  ๊ฒฝ์šฐ 656 ๋ผ์ธ์˜ objectFactory.createI() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์˜€์œผ๋‚˜, @AllArgs๊ฐ€ ์กด์žฌํ•  ๊ฒฝ์šฐ ๊ทธ ๋‹ค์Œ์˜ 658 ๋ผ์ธ์ธ createByConstructorSignature() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

 

DefaultResultSetHandler - createByConstructorSignature()

  • ์œ„์—์„œ ์ƒ์„ฑ์ž์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž…์„ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ ์ปฌ๋Ÿผ์— ๋Œ€ํ•œ ์ •๋ณด ๋ฐ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ’์„ constructorArgType, constructorArgs ๋ณ€์ˆ˜์— add ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฒฐ๊ตญ ์œ„ ๋ฉ”์„œ๋“œ๋„ objectFactory.create() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฑด ๊ธฐ๋ณธ ์ƒ์„ฑ์ž์˜ ๋กœ์ง๊ณผ ๋™์ผํ•˜์ง€๋งŒ, ์ฐจ์ด์ ์€ ์ƒ์„ฑ์ž์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ null์ด ์•„๋‹Œ ์ƒํƒœ๋กœ create() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

 

DefaultObjectFactory - create()

  • ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋งŒ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ์™€๋Š” ๋‹ฌ๋ฆฌ, ์ƒ์„ฑ์ž ์ธ์ž์˜ ํƒ€์ž…๊ณผ ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๊ฐ€ ์กด์žฌํ•  ๋•Œ์˜ 62๋ผ์ธ์„ ํ˜ธ์ถœํ•˜๋Š” ๊ฒŒ ์•„๋‹Œ, 74๋ผ์ธ์„ ํ˜ธ์ถœํ•˜์—ฌ ์ƒ์„ฑ์ž ์ธ์ž์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

โ€ป ๋”ฐ๋ผ์„œ, ์ผ๋ถ€ ํ•„๋“œ๋งŒ ํฌํ•จํ•˜๋Š” ์ƒ์„ฑ์ž๊ฐ€ ์กด์žฌํ•  ๊ฒฝ์šฐ, ์ƒ์„ฑ์ž์— ์กด์žฌํ•˜๋Š” ํ•„๋“œ๋งŒ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์ด ๋˜๊ณ , ๋‚˜๋จธ์ง€ ํ•„๋“œ๋Š” null๋กœ ๋งคํ•‘๋ฉ๋‹ˆ๋‹ค.

 

 

5. ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ƒ์„ฑ์ž๊ฐ€ ์กด์žฌํ•  ๊ฒฝ์šฐ

์œ„ ํ…Œ์ŠคํŠธ์—์„œ ์‚ดํŽด๋ณด์•˜๋˜ 5) ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ƒ์„ฑ์ž๊ฐ€ ์กด์žฌํ•  ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ๋ถ„์„์ž…๋‹ˆ๋‹ค.

  • ์œ„์˜ ๊ฒฝ์šฐ DefaultResultSetHandler ํด๋ž˜์Šค์˜ createByConstructorSignature() ๋ฉ”์„œ๋“œ์—์„œ ์–ด๋– ํ•œ ์ƒ์„ฑ์ž๋ฅผ ์„ ํƒํ•ด์•ผ ํ• ์ง€ ์•Œ ์ˆ˜ ์—†๊ธฐ์— Exception ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
    • ๋ชจ๋“  ํ•„๋“œ์˜ ์ƒ์„ฑ์ž(@AllArgs)๊ฐ€ ์กด์žฌํ•  ๋• ์œ„ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ์œ„ if๋ฌธ์˜ allowedConstructorUsingTypeHandlers() ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ ์ƒ์„ฑ์ž์˜ ํ•„๋“œ ๊ฐฏ์ˆ˜๊ฐ€ ๋ชจ๋“  ํ•„๋“œ์˜ ๊ฐฏ์ˆ˜๋ฅผ ๋น„๊ตํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 

6. ์ผ๋ถ€ ํ•„๋“œ๋ฅผ ๊ฐ€์ง€๋Š” ๋‹จ ํ•˜๋‚˜์˜ ์ƒ์„ฑ์ž๋งŒ ์กด์žฌํ•  ๊ฒฝ์šฐ

ํ•ด๋‹น ์ผ€์ด์Šค๋Š” 4. ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ ์™€ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•˜์—ฌ ์ƒ์„ฑ์ž์— ์กด์žฌํ•˜๋Š” ํ•„๋“œ์— ๋Œ€ํ•ด์„œ๋งŒ ๋งคํ•‘์ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

 

 

๐Ÿ’ก ์ •๋ฆฌ

๋ฌผ๋ก  ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณธ ๊ฑด ์•„๋‹ˆ์ง€๋งŒ, ๊ฐ์ฒด์˜ ๋งคํ•‘์ด ์ด๋ฃจ์–ด์ง€๊ธฐ๊นŒ์ง€ ๋‹ค์–‘ํ•œ ๊ณผ์ •์„ ํ†ตํ•ด ์ง„ํ–‰๋˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์™€ ๊ฐ์ฒด์™€ ๋งคํ•‘์„ ํ•  ๋•Œ @AllArgs๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ(alias)๋Š” ์—†์• ๋Š” ๊ฒŒ ์ข‹์ง€ ์•Š์„๊นŒ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์—ˆ๋Š”๋ฐ, ํŒ€์›๋ถ„์ด ๋ง์”€ํ•ด ์ฃผ์‹  ๋Œ€๋กœ ์œ ์ง€ ๋ณด์ˆ˜ ์ธก๋ฉด์—์„œ๋Š” @NoArgs + alias์˜ ์กฐํ•ฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์—๋„ ์œ ์—ฐํ•˜๊ฒŒ ๊ฐ€์ ธ๊ฐ€๋Š” ๊ฒƒ์ด ์ข‹์ง€ ์•Š์„๊นŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

 

 

๐Ÿ“ ์ฐธ๊ณ  ๋ฌธ์„œ

 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€