JiwonDev

์ข‹์€ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•

by JiwonDev
 

๋‹จ์œ„ ํ…Œ์ŠคํŠธ - YES24

์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์— ์žˆ์–ด ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋Š” ์ด์ œ ์„ ํƒ์ด ์•„๋‹ˆ๋ผ ํ•„์ˆ˜๊ฐ€ ๋๋‹ค. ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•œ ์˜คํ•ด๋ฅผ ๋ฐ”๋กœ์žก๊ณ , ์˜ฌ๋ฐ”๋ฅธ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•œ ์›์น™, ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์Šคํƒ€์ผ๊ณผ ํšจ๊ณผ์ ์ธ ํ…Œ์ŠคํŠธ

www.yes24.com

ํ…Œ์ŠคํŠธ๋Š” ์†Œํ”„ํŠธ์›จ์–ด ํ”„๋กœ์ ํŠธ์—์„œ ๋น ์ง€๋ฉด ์•ˆ๋˜๋Š” ํ•„์ˆ˜ ์š”์†Œ์ด๋‹ค.

ํ•˜์ง€๋งŒ ์ปจํŠธ๋กค๋Ÿฌ์— ์žˆ๋Š” ๋‹จ 3์ค„์˜ ์ฝ”๋“œ๋ฅผ ์œ„ํ•ด ๋ฐ˜๋ณต๋˜๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ณ , ํ…Œ์ŠคํŠธ์— ํ•„์š”ํ•œ ๋ณต์žกํ•œ ์˜์กด๊ด€๊ณ„๋ฅผ ํ•˜๋‚˜ํ•˜๋‚˜ ๋งŒ๋“ค๋‹ค๋ณด๋ฉด ๋ฌด์–ธ๊ฐ€ ์ž˜๋ชป๋˜์—ˆ๋‹ค๋Š” ์‹ ํ˜ธ๋ฅผ ๋ชธ์œผ๋กœ ๋Š๋ผ๊ฒŒ ๋œ๋‹ค.

 

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ๋ˆ„๊ตฌ์—๊ฒŒ๋‚˜ ์žฌ๋ฏธ์—†๊ณ  ๊ท€์ฐฎ์€ ๋ฐ˜๋ณต์ž‘์—…์ด๋‹ค.

๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ํ…Œ์ŠคํŠธ๋Š” ํ•„์š”ํ•˜๋‹ค.

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

 

๐Ÿ’ญ ํ…Œ์ŠคํŠธ์˜ ๋ชฉ์ 

์ „์šฉ ํ”„๋ ˆ์ž„์›Œํฌ๋‚˜ Mock ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ž˜ ์“ด๋‹ค๊ณ  ์ข‹์€ ํ…Œ์ŠคํŠธ์ธ๊ฒŒ ์•„๋‹ˆ๋‹ค. ์˜คํžˆ๋ ค ํ…Œ์ŠคํŠธ์— ์ „ํ˜€ ํ•„์š”์—†์„ ์ˆ˜๋„ ์žˆ๋‹ค.

ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•จ์œผ๋กœ์„œ ์–ป๋Š” ์ด๋“๊ณผ ๋“ค์–ด๊ฐ€๋Š” ๋…ธ๋ ฅ์„ ํ•ญ์ƒ ๊ณ ๋ คํ•ด์•ผํ•˜๊ณ , ํ…Œ์ŠคํŠธ์— ๋“œ๋Š” ๋…ธ๋ ฅ์„ ์ตœ์†Œํ™” ํ•ด์•ผํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์˜ค๋ž˜๋œ ๊ธฐ์กด์ฝ”๋“œ๋ฅผ ์ „๋ถ€ ๋œฏ์–ด๊ฐ€๋ฉฐ ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฑด ์ข‹์ง€์•Š๋‹ค. ์ด๋Š” ํˆฌ์ž ๋Œ€๋น„ ์ƒ์‚ฐ์„ฑ์ด ์ „ํ˜€ ์—†๊ธฐ ๋•Œ๋ฌธ.

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์–ป๋Š” ์ด๋“๊ณผ, ๊ฑฐ๊ธฐ์— ๋“ค์–ด๊ฐ€๋Š” ๋น„์šฉ์„ ๊ณ ๋ คํ•ด์•ผํ•œ๋‹ค.

 

์•„๋ž˜์™€ ๊ฐ™์€ ์กฐ๊ฑด์˜ ๊ธฐ์—…์šฉ ์•ฑ์„ ์ž‘์„ฑํ•  ๋•Œ, ํ…Œ์ŠคํŠธ์˜ ํšจ์œจ์„ ๊ทน๋Œ€ํ™”ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ์ž‘์„ฑํ•ด์•ผํ• ๊นŒ?

  • ๋†’์€ ๋น„์ฆˆ๋‹ˆ์Šค ๋ณต์žก๋„
  • ๊ธด ํ”„๋กœ์ ํŠธ ์ˆ˜๋ช…, ์œ ์ง€๋ณด์ˆ˜ ๊ธฐ๊ฐ„
  • ์ค‘๊ฐ„ ํฌ๊ธฐ์˜ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ
  • ๋‚ฎ๊ฑฐ๋‚˜ ์ค‘๊ฐ„ ์ •๋„์˜ ์„ฑ๋Šฅ ์š”๊ตฌ

 

๐Ÿ“‘ ๋ฌด์—‡์ด ์ข‹์€ ํ…Œ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค๊นŒ?

์šฐ์„ , ํ”ํžˆ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ ์ปค๋ฒ„๋ฆฌ์ง€ 100%๋Š” ์ข‹์€ ํ…Œ์ŠคํŠธ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.

ํŒ€์›๊ฐ„์˜ ํ•ฉ์˜์—†์ด ๋ฌด์ž‘์ • ๋†’์€ ์ปค๋ฒ„๋ฆฌ์ง€๋ฅผ ๊ณ ์ง‘ ๋ถ€๋ฆฐ๋‹ค๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์€ ์–ด์ด์—†๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ ๋‚˜์˜ฌ์ง€๋„ ๋ชจ๋ฅธ๋‹ค.

int add(int a, int b){
    return a - b;
}

@Test
@DisplayName("add ํ•จ์ˆ˜๋Š” ๋‘ ์ •์ˆ˜๋ฅผ ๋”ํ•ด์„œ ์ •์ˆ˜ํ˜•์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.")
void test(){
    // ์ปค๋ฒ„๋ฆฌ์ง€๋ฅผ ์–ต์ง€๋กœ ์ฑ„์šฐ๊ธฐ ์œ„ํ•ด์„œ ์ „ํ˜€ ๊ฒ€์ฆ๋˜์ง€ ์•Š๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.
    assertThat(add(0, 0)).isEqualTo(0);
    assertThat(add(1, 0)).isEqualTo(1);
}

์šฐ๋ฆฌ๋Š” ํ…Œ์ŠคํŠธ์˜ ๋Œ€์ƒ์— ์ง‘์ค‘ํ•˜๊ณ , ๊ทธ ๋Œ€์ƒ์„ ๊ฒ€์ฆํ•ด์•ผํ•œ๋‹ค.

์ปค๋ฒ„๋ฆฌ์ง€๋Š” ๋ถ€์ • ์ง€ํ‘œ๋กœ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค. ๋„ˆ๋ฌด ๋‚ฎ์œผ๋ฉด ํ™•์‹คํ•˜๊ฒŒ ์•ˆ์ข‹์€ ์ฝ”๋“œ์ง€๋งŒ, ๋†’๋‹ค๊ณ  ๋ฌด์กฐ๊ฑด ์ข‹์€ ๊ฑด ์•„๋‹ˆ๋‹ค.   

๋ณ‘์›์—์„œ ํ™˜์ž์˜ ์ฒด์˜จ์ด ๋†’์œผ๋ฉด ์—ด์ด ๋‚œ๋‹ค๋Š” ๊ฒƒ์ด๊ณ , ์ด ์ˆ˜์น˜๋ฅผ ์ด์šฉํ•ด ํ™˜์ž์˜ ์ƒํ™ฉ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ 'ํ™˜์ž'๊ฐ€ ์•„๋‹ˆ๋ผ 'ํ™˜์ž์˜ ๋‚ฎ์€ ์ฒด์˜จ'์ด ๋ชฉํ‘œ๊ฐ€ ๋˜์–ด๋ฒ„๋ฆฌ๋ฉด ์ ˆ๋Œ€ ์•ˆ๋œ๋‹ค.
์•ฝ์ด๋‚˜ ์น˜๋ฃŒ๋Š” ์น˜์›Œ๋ฒ„๋ฆฌ๊ณ  ๋‹น์žฅ ํ™˜์ž์˜†์— ์—์–ด์ปจ์„ ์„ค์น˜ํ•˜๋Š”๊ฒŒ ๊ฐ€์žฅ ์ข‹์€ ์ฝ”๋“œ๊ฐ€ ๋˜์–ด๋ฒ„๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

๊ฒฐ๊ตญ ์ข‹์€ ํ…Œ์ŠคํŠธ๋ผ๋Š” ๊ฑด

  • ๋”ฐ๋กœ ์‹œ๊ฐ„๋‚ด์„œ ์ž‘์„ฑํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ, ๊ฐœ๋ฐœ ์ฃผ๊ธฐ์— ํ†ตํ•ฉ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„(ํ•ต์‹ฌ ๋Œ€์ƒ)๋งŒ์„ ํ…Œ์ŠคํŠธ ํ•œ๋‹ค.
    ํ…Œ์ŠคํŠธํ•  ๋Œ€์ƒ์ด ์•„๋‹Œ ๊ฒƒ โžก ์ธํ”„๋ผ, ์™ธ๋ถ€์‹œ์Šคํ…œ(DB, ์„œ๋“œํŒŒํ‹ฐ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ), ๋ชจ๋“  ๊ฒƒ์„ ํ•˜๋‚˜๋กœ ๋ฌถ๋Š” ํ†ตํ•ฉ์ฝ”๋“œ
  • ์ตœ์†Œํ•œ์˜ ์œ ์ง€๋น„๋กœ ์ตœ๋Œ€์˜ ๊ฐ€์น˜๋ฅผ ๋Œ์–ด๋‚ด์•ผ ํ•œ๋‹ค.
    ์•„๋ฌด๋Ÿฐ ๊ฒ€์ฆ๋„ ํ•˜์ง€์•Š๊ณ , ์–ด๋– ํ•œ ๊ฐ€์น˜๋„ ๋งŒ๋“ค์–ด ๋‚ด์ง€์•Š๋Š” ์ฝ”๋“œ. ๊ทธ์ € ์ปค๋ฒ„๋ฆฌ์ง€๋ฅผ ์ฑ„์šฐ๊ธฐ ์œ„ํ•œ ํ…Œ์ŠคํŠธ๋Š” ํ•„์š”์—†๋‹ค.

 


๐Ÿ’ญ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ

  • ์ž‘์€ ์ฝ”๋“œ ๋‹จ์œ„๋ฅผ
  • ๋น ๋ฅด๊ฒŒ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ณ 
  • ๊ฒฉ๋ฆฌ๋œ ๋ฐฉ์‹์œผ๋กœ ์ž๋™ํ™”ํ•˜๋Š” ํ…Œ์ŠคํŠธ

์šฐ๋ฆฌ๋Š” ํ…Œ์ŠคํŠธํ•˜๋Š” ๋Œ€์ƒ์— ์ง‘์ค‘ํ•ด์•ผํ•˜๊ณ , ๋‹ค๋ฅธ ์™ธ๋ถ€์˜ ๋ฌธ์ œ๊ฐ€ ์˜ํ–ฅ๋ผ์น˜์ง€ ์•Š๊ฒŒ ๊ฒฉ๋ฆฌํ•ด์•ผํ•œ๋‹ค.

๊ฐ์ฒด์ง€ํ–ฅ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด, ๊ฐ๊ฐ์˜ ๊ฐ์ฒด๋“ค์€ ์„œ๋กœ ๋‹ค๋ฅธ ์˜์กด์„ฑ(ํ˜‘๋ ฅ)์„ ํ†ตํ•ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค.

 

ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๊ฒ ๋‹ต์‹œ๊ณ  ๋ชจ๋“  ์˜์กด์„ฑ์„ ๋‹ค ๋งŒ๋“ค์ˆœ ์—†๋‹ค. ์˜์กด์„ฑ์„ ๋Œ€์‹ ํ•ด์ค„ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์˜ ๋Œ€์—ญ(Test Double)์ด ํ•„์š”ํ•˜๋‹ค.
์—ฌ๋‹ด์œผ๋กœ, ๊ฐ์ฒด์ง€ํ–ฅ์ ์ธ ์ฝ”๋“œ๋Š” ํ…Œ์ŠคํŠธํ•˜๊ธฐ๋„ ์ข‹๋‹ค. ๊ตฌํ˜„ ์ฝ”๋“œ๋ฅผ ๋ชฐ๋ผ๋„ ๋‹ค๋ฅธ ๊ฐ์ฒด์— '๋ฉ”์‹œ์ง€'๋ฅผ ๋ณด๋‚ด๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ.

public class FakeObject {

    Map<Integer, Object> database = new HashMap<>();
    int count = 0;

    public Object get(int key) {
        return database.get(key);
    }

    public void save(Object data) {
        database.put(count++, data);
    }

    public int getCount(){
        return 10; // ํ…Œ์ŠคํŠธ์šฉ Stub ๊ฐ’
    }
}

 

์ข‹์€ ํ…Œ์ŠคํŠธ์™€ ์ „ํ˜€ ๊ฐ€์น˜์—†๋Š” ํ…Œ์ŠคํŠธ๋Š” ํ™•์‹คํ•˜๊ฒŒ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‚ด๊ฐ€ ์ž˜ ํ•˜๊ณ ์žˆ๋Š”๊ฑด๊ฐ€ ๊ถ๊ธˆํ•˜๋‹ค๋ฉด, ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์•„๋ž˜์˜ ํŠน์„ฑ์„ ์ž˜ ์ง€ํ‚ค๊ณ  ์žˆ๋Š”์ง€ ๊ณ ๋ คํ•ด๋ณด์ž.

  • ํšŒ๊ท€๋ฐฉ์ง€
  • ๋ฆฌํŒฉํ„ฐ๋ง ๋‚ด์„ฑ
  • ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ

 

๐Ÿ“‘ ํšŒ๊ท€๋ฐฉ์ง€

ํšŒ๊ท€๋Š” ์ผ์ข…์˜ ์†Œํ”„ํŠธ์›จ์–ด ๋ฒ„๊ทธ์ด๋‹ค.

์ •ํ™•ํžˆ๋Š” ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ–ˆ์„ ๋•Œ, ์˜๋„ํ•œ ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์•„ ์ด๋ฏธ ์™„์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๋ ค๊ณ  ๋Œ์•„๊ฐ€๋Š” ๊ฒƒ.

ํ”„๋กœ์ ํŠธ๊ฐ€ ์ปค์ง€๋ฉด์„œ ์†Œํ”„ํŠธ์›จ์–ด์˜ ๋ณต์žก๋„๋Š” ์ •๋ง ๋น ๋ฅด๊ฒŒ ์ฆ๊ฐ€ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ํšŒ๊ท€๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ ์ž ๋ฏธ๋ฆฌ ํ…Œ์ŠคํŠธ ํ•ด์•ผํ•œ๋‹ค.

 

ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ–ˆ๋Š”๋ฐ ๊ธฐ๋Šฅ์€ ๊ณ ์žฅ๋‚˜๋Š” ๊ฑฐ์ง“์Œ์„ฑ(False Nagative)์„ ๋งŒ๋“ค์ง€ ๋ง์ž. ํšŒ๊ท€ํ•˜์ง€ ์•Š๋„๋ก ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ํ…Œ์ŠคํŠธ๋กœ ๊ฒ€์ฆํ•˜์ž.

 

์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ๊ฒƒ์€, `ํšŒ๊ท€ํ•˜์ง€ ์•Š๋„๋ก` ํ…Œ์ŠคํŠธ๋กœ ๊ฒ€์ฆํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ํšŒ๊ท€ ์˜ค๋ฅ˜๊ฐ€ ์ƒ๊ธธ์ผ์ด ์—†๋Š” ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•˜์ง€๋Š” ๋ง์ž. ์˜ˆ๋ฅผ ๋“ค์–ด User.getName() ์ฒ˜๋Ÿผ ์•„๋ฌด๋Ÿฐ ๋กœ์ง์ด ์—†๋Š” ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์€ ์•„๋ฌด๋Ÿฐ ๊ฐ€์น˜๊ฐ€ ์—†๋‹ค.

 

 

๐Ÿ“‘ ๋ฆฌํŒฉํ„ฐ๋ง ๋‚ด์„ฑ

ํ…Œ์ŠคํŠธ๋Š” ์ฝ”๋“œ ๋ฆฌํŒฉํ„ฐ๋ง์— ๋‚ด์„ฑ์ด ์žˆ์–ด์•ผํ•œ๋‹ค.

์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ–ˆ๊ณ , ๋ชจ๋“  ๊ฒƒ์ด ์ž˜ ๋™์ž‘ํ•˜๋Š”๋ฐ ๊ธฐ์กด ํ…Œ์ŠคํŠธ๊ฐ€ ๊นจ์ง€๋ฉด ์•ˆ๋œ๋‹ค. ์ด๋Ÿฌํ•œ ํ—ˆ์œ„ ๊ฒฝ๋ณด๋Š” ํ…Œ์ŠคํŠธ์˜ ๊ฐ€์น˜๋ฅผ ๋–จ์–ด๋œจ๋ฆฌ๊ณ  ๊ฒฐ๊ตญ ๊ฐœ๋ฐœ์ž๋Š” ํ…Œ์ŠคํŠธ ์ˆ˜์ •์„ ํ”ผํ•˜๊ธฐ์œ„ํ•ด์„œ ์ฝ”๋“œ ๋ณ€๊ฒฝ์„ ์ตœ์†Œํ™”ํ•˜๋ ค๊ณ  ํ•˜๊ฒŒ๋œ๋‹ค.

 

ํ…Œ์ŠคํŠธ๊ฐ€ ๋ฆฌํŒฉํ† ๋ง์— ๋‚ด์„ฑ์ด ์žˆ์œผ๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผํ• ๊นŒ?

๊ฐ„๋‹จํ•˜๋‹ค. ๊ตฌํ˜„ ์„ธ๋ถ€์‚ฌํ•ญ์ด ์•„๋‹Œ, ์ตœ์ข… ๊ฒฐ๊ณผ๋ฅผ ํ…Œ์ŠคํŠธ ๋ชฉํ‘œ๋กœ ์‚ผ์œผ๋ฉด ๋œ๋‹ค.

 

ํšŒ๊ท€๋ฐฉ์ง€์—์„œ๋Š” ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋ผ๊ณ  ํ–ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์—ฌ๊ธฐ์„  ํ•˜์ง€๋ง๋ผ๊ณ ? ๊ทธ๊ฒŒ ์•„๋‹ˆ๋‹ค. ์กฐ๊ธˆ ๋” ์ƒ๊ฐํ•ด๋ณด์ž.

ํšŒ์›๊ฐ€์ž…์„ ํ•  ๋•Œ ๋น„๋ฐ€๋ฒˆํ˜ธ์˜ PasswordEncoder ๊ฐ™์€ ๋‚ด๋ถ€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋ฐ”๋€Œ์—ˆ๋‹ค๊ณ  ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ์— ์˜ํ–ฅ์ด ์žˆ์„๊นŒ?

์‚ฌ์‹ค ํ…Œ์ŠคํŠธ๋ฅผ ํ•  ๋•Œ ๊ทธ ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ๋™์ž‘๊นŒ์ง€ ์•Œ ํ•„์š”๋Š” ์—†๋‹ค. ๊ณต๊ฐœ๋œ ๋™์ž‘(api)์„ ์‹คํ–‰ํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋งŒ ํ™•์ธํ•˜๋ฉด ๋œ๋‹ค.

 

๋ฐ˜๋Œ€๋กœ ๋งํ•˜๋ฉด, ๊ตฌํ˜„์˜ ์„ธ๋ถ€์‚ฌํ•ญ์ด ๋ณ€ํ–ˆ์„ ๋•Œ ํ…Œ์ŠคํŠธ๊ฐ€ ๊นจ์งˆ ์ˆ˜ ์žˆ๋‹ค๋ฉด, ๊ดœ์ฐฎ์•„๋ณด์ด์ง€๋งŒ ์ž˜๋ชป๋œ ๊ฑฐ์ง“์–‘์„ฑ(False Positive) ํ…Œ์ŠคํŠธ๊ฐ€ ์•„๋‹Œ๊ฐ€ ์˜์‹ฌํ•ด์•ผํ•œ๋‹ค. [์‚ฌ์‹ค ๋ฆฌํŒฉํ„ฐ๋ง ๋‚ด์„ฑ์€ ํ”„๋กœ์ ํŠธ ์ดˆ๋ฐ˜์—๋Š” ํฐ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค.]

๋”๋ณด๊ธฐ

๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ํšŒ๊ท€๋ฐฉ์ง€๋Š” ์•Œ๊ฒŒ๋ชจ๋ฅด๊ฒŒ ํ•˜๊ณ ์žˆ์ง€๋งŒ, ๋ฆฌํŒฉํ„ฐ๋ง ๋‚ด์„ฑ(๊ฑฐ์ง“ ์–‘์„ฑ)์—๋Š” ๋‘”๊ฐํ•œ ์‚ฌ๋žŒ๋“ค์ด ๋งŽ๋‹ค.

๊ทธ ์ด์œ ๋Š” ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐ์—๋Š” ๊ฑฐ์ง“์–‘์„ฑ์ด ํฐ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋‹น์žฅ์€ ๋ฆฌํŒฉํ† ๋งํ•˜๋Š”๊ฒŒ ๋” ์‰ฌ์šฐ๋‹ˆ๊นŒ.

 

ํ•˜์ง€๋งŒ ํ”„๋กœ์ ํŠธ๊ฐ€ ์ปค์ง€๋ฉด ์ปค์งˆ์ˆ˜๋ก ๋ฆฌํŒฉํ† ๋ง ๋‚ด์„ฑ์€ ์ค‘์š”ํ•ด์ง„๋‹ค. ๊ธฐ๋Šฅ ๊ณ ์žฅ์ด ์•„๋‹Œ๋ฐ๋„ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ณ„์† ๊นจ์ง€๋ฉด์„œ ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•œ ์‹ ๋ขฐ๋ฅผ ์žƒ๊ฒŒ๋˜๊ณ , ๊ฐœ๋ฐœ์ž๋Š” ์˜๋ฌด๊ฐ์— ์ž‘์„ฑํ•˜๋Š” ๊ฐ€์น˜์—†๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ๊ณ„์† ์ž‘์„ฑํ•˜๊ฒŒ ๋œ๋‹ค.

 

 

๐Ÿ“‘ ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ 

๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ ๋˜ํ•œ ๋‹จ์œ„ํ…Œ์ŠคํŠธ์—์„œ ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค.

๋ชจ๋“  ์˜์กด์„ฑ์„ ๋‹ค ๊ฒ€์‚ฌํ•˜๋Š”๊ฒŒ ์•„๋‹Œ, ๊ทธ ๋Œ€์ƒ๋งŒ์„ ๋น ๋ฅด๊ฒŒ ๊ฒ€์ฆํ•˜๊ณ  ๋ฒ„๊ทธ๋ฅผ ํ”ผ๋“œ๋ฐฑํ•จ์œผ๋กœ์„œ ๋ฒ„๊ทธ ์ˆ˜์ •๋น„์šฉ์„ ํฌ๊ฒŒ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฏธ ์ถฉ๋ถ„ํ•œ ๊ฒ€์ฆ์„ ํ–ˆ๋‹ค๋ฉด, ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋”๋ผ๋„ ๊ธฐ์กด ์ฝ”๋“œ๊ฐ€ ๊นจ์ง€์ง€ ์•Š์„๊นŒ ๋‘๋ ค์›Œํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

 

๋น„์Šทํ•œ ๋งฅ๋ฝ์œผ๋กœ, ๋‹จ์œ„ํ…Œ์ŠคํŠธ๋Š” ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ์ข‹์•„์•ผ ํ•œ๋‹ค.

ํ…Œ์ŠคํŠธ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ณ  ์™ธ๋ถ€ ์˜์กด์„ฑ์—†์ด ๋ฐ”๋กœ ์‹คํ–‰ํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ฆ์œผ๋กœ์„œ ๋‚˜์ค‘์— ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋”๋ผ๋„ ํ…Œ์ŠคํŠธ์˜ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์›Œ์ง„๋‹ค. 

 

 

๐Ÿ“‘ ์ด์ƒ์ ์ธ ํ…Œ์ŠคํŠธ๋Š” 3๊ฐ€์ง€๊ฐ€ ๊ณจ๊ณ ๋ฃจ ๊ฐ–์ถฐ์ ธ์•ผํ•œ๋‹ค.

์ด 3๊ฐ€์ง€๋Š” ๋”ฐ๋กœ ๋…ธ๋Š” ๊ฐœ๋…๋“ค์ด ์•„๋‹ˆ๋‹ค.

์žˆ์œผ๋ฉด ์ข‹๊ณ , ์—†์œผ๋ฉด ์„ญ์„ญํ•œ ๊ทธ๋Ÿฐ ์š”์†Œ๋“ค์ด ์•„๋‹ˆ๊ณ  ํ…Œ์ŠคํŠธ์—๋Š” ์ด ์š”์†Œ๋“ค์ด ๋‹ค ๊ณจ๊ณ ๋ฃจ ๊ฐ–์ถ”์–ด์ ธ์žˆ์–ด์•ผ ํ•œ๋‹ค.

๋‹จ์œ„ํ…Œ์ŠคํŠธ์™€ ํ†ตํ•ฉํ…Œ์ŠคํŠธ, ๋‘˜ ๋‹ค ํ•ด๋ด์•ผํ•ฉ๋‹ˆ๋‹ค.&amp;amp;amp;nbsp;

 

#1. ๊ทน๋‹จ์ ์ธ ์‚ฌ๋ก€1 : E2E(End to End) ํ…Œ์ŠคํŠธ

E2E๋Š” ์ตœ์ข… ์‚ฌ์šฉ์ž ๊ด€์ ์—์„œ ๋ชจ๋“  ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

์ด๋Š” ์ง์ ‘ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•˜์—ฌ ์™ธ๋ถ€๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ํ”„๋ ˆ์ž„์›Œํฌ, DB๋“ฑ์„ ๋ชจ๋‘ ํ…Œ์ŠคํŠธํ•œ๋‹ค.
๋ฆฌํŒฉํ† ๋ง ๋‚ด์„ฑ์€ ์–ด๋–ค๊ฐ€? ์‚ฌ์šฉ์ž ๊ด€์ ์—์„œ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด๋ถ€๊ตฌํ˜„์„ ์ „ํ˜€ ์•Œ ํ•„์š”๊ฐ€ ์—†๋‹ค. ๊ฒฐ๊ณผ๋งŒ ๊ฒ€์ฆํ•œ๋‹ค.

  • โœ” ํšŒ๊ท€๋ฐฉ์ง€๊ฐ€ ์šฐ์ˆ˜ํ•˜๋‹ค.
  • โœ” ๋ฆฌํŒฉํ† ๋ง ๋‚ด์„ฑ ๋˜ํ•œ ์šฐ์ˆ˜ํ•˜๋‹ค.

๊ทธ๋Ÿผ ๋ชจ๋“  ํ…Œ์ŠคํŠธ๋ฅผ E2E๋กœ ๋งŒ๋“ค๋ฉด ์ตœ๊ณ ์ผํ…๋ฐ ์™œ ๊ทธ๋ ‡๊ฒŒ ํ•˜์ง€ ๋ชปํ• ๊นŒ?

์ด์œ ๋Š” ๋‹จ์ˆœํ•˜๋‹ค. ํ…Œ์ŠคํŠธ๋ฅผ ์ค€๋น„ํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ต๊ณ  ๋ชจ๋“  ๊ตฌํ˜„์ด ์™„๋ฃŒ๋˜์–ด์•ผ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

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

 

 

#2 ๊ทน๋‹จ์ ์ธ ์‚ฌ๋ก€2 : ๋„ˆ๋ฌด ๊ฐ„๋‹จํ•œ ํ…Œ์ŠคํŠธ

ํ”ผ๋“œ๋ฐฑ์ด ๋Š๋ฆฌ๋‹ค๊ณ ? ์ข‹๋‹ค ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ฒƒ์„ ํ…Œ์ŠคํŠธํ•ด๋ณด๊ณ , ๋น ๋ฅด๊ฒŒ ํ”ผ๋“œ๋ฐฑ ๋ฐ›์•„๋ณด์ž

public class User {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
@Test
@DisplayName("User ๊ฐ์ฒด์—์„œ name์„ ์กฐํšŒํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.")
void Test() {
    // Arrange
    var sut = new User(); // sut => System under test, ํ…Œ์ŠคํŠธ ๋Œ€์ƒ ๊ฐ์ฒด
    var string = "New User Name";

    // Act
    sut.setName(string);

    // Assert
    assertThat(sut.getName()).isEqualTo(string);
}
  • โœ” ํ”ผ๋“œ๋ฐฑ ์ฃผ๊ธฐ๊ฐ€ ๋งค์šฐ ๋น ๋ฅด๋‹ค.
  • โœ” ๋‚ด๋ถ€ ๊ตฌํ˜„์ด ์•„๋‹ˆ๋ผ ๊ณต๊ฐœ๋œ api๋งŒ ํ…Œ์ŠคํŠธ ํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ๋ฆฌํŒฉํ† ๋ง ๋‚ด์„ฑ ๋˜ํ•œ ๊ทธ๋ ‡๊ฒŒ ๋‚˜์˜์ง€ ์•Š๋‹ค.

ํ•˜์ง€๋งŒ ๋ฌด์–ธ๊ฐ€ ์ด์ƒํ•˜๋‹ค๊ณ  ๋Š๊ปด์ง„๋‹ค. ์•„๋ฌด๋Ÿฐ ๊ฐ€์น˜๋„ ์—†๊ณ  ๋น„์Šทํ•œ ํ…Œ์ŠคํŠธ๊ฐ€ ์ˆ˜๋ฐฑ๊ฐœ๋Š” ๋ฐ˜๋ณต๋œ๋‹ค. ์ด๊ฑธ ์™œ ์ž‘์„ฑํ•˜๋Š” ๊ฑธ๊นŒ?

์ด๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ  ํšŒ๊ท€ ๋ฐฉ์ง€๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ…Œ์ŠคํŠธ๋Š” 'ํšŒ๊ท€๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด` ์ž‘์„ฑํ•ด์•ผํ•œ๋‹ค. ์ „ํ˜€ ํšŒ๊ท€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์„ ๊ฒƒ ๊ฐ™์€ ๋‹จ์ˆœํ•œ ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธ ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

 

 

#3. ๊ทน๋‹จ์ ์ธ ์‚ฌ๋ก€3: ๊นจ์ง€๊ธฐ ์‰ฌ์šด ํ…Œ์ŠคํŠธ

๊ทธ๋Ÿผ ๋งˆ์ง€๋ง‰์œผ๋กœ ๋ฆฌํŒฉํ† ๋ง ๋‚ด์„ฑ์€ ๋˜ ์–ด๋–จ๊นŒ?

์ด๋Š” ์œ„ํ•ด์„œ ์–ธ๊ธ‰ํ–ˆ์œผ๋ฏ€๋กœ, ๊ฐ„๋‹จํ•˜๊ฒŒ ์ฝ”๋“œ๋กœ๋งŒ ์‚ดํŽด๋ณด๊ณ  ๋„˜์–ด๊ฐ€๋„๋ก ํ•˜์ž.

@Getter
public class UserRepository() {
    // ์‹ค์ œ Repository ๊ฐ์ฒด
    private String lastExecutedSqlStatement();
}

@Test
@DisplayName("UserRepository ๊ฐ์ฒด์˜ getById ๋ฉ”์„œ๋“œ๋Š” ์˜ฌ๋ฐ”๋ฅธ SQL๋ฌธ์„ ์ž‘์„ฑํ•œ๋‹ค. ")
void Test() {
    // Arrange
    var sut = new UserRepository();

    // Act
    User user = sut.getById(5);

    // Assert
    Assertions.assertThat(sut.getLastExecutedSqlStatement)
        .isEqualTo("SELECT * FROM dbo.[User] WHERE UserId = 5");
}

๋งŒ์•ฝ DB๋ฅผ ํŠœ๋‹ํ•˜๊ฒŒ๋˜์–ด SQL๋ฌธ์ด ๋ณ€๊ฒฝ๋˜๊ฑฐ๋‚˜, ์ง์ ‘ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜์ง€์•Š๊ณ  ORM์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ณ€๊ฒฝ๋œ๋‹ค๋ฉด ์–ด๋–จ๊นŒ?

ํ…Œ์ŠคํŠธ๋Š” ํ•ต์‹ฌ ๋Œ€์ƒ์„ ํ…Œ์ŠคํŠธํ•˜๋Š”๊ฑฐ์ง€ ๋‚ด๋ถ€ ๊ตฌํ˜„์‚ฌํ•ญ์„ ๋ชฐ๋ผ๋„ ํฐ ์ƒ๊ด€์ด ์—†๋‹ค. ์„ธ๋ถ€์‚ฌํ•ญ์„ ํ…Œ์ŠคํŠธํ•˜๋ฉด ์•ˆ๋œ๋‹ค.

 

ํšŒ์›๊ฐ€์ž…์„ ํ•˜๋Š”๋ฐ DB๋‚˜ passwordEncoder ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋ฐ”๋€Œ์–ด๋„ ๋™์ž‘์—๋Š” ์•„๋ฌด๋Ÿฐ ์˜ํ–ฅ์ด ์—†๋‹ค.

ํ•˜์ง€๋งŒ ํšŒ์›๊ฐ€์ž… ํ…Œ์ŠคํŠธ๋Š” ์ „๋ถ€ ์‹คํŒจํ•  ๊ฒƒ์ด๋‹ค. ๋ฆฌํŒฉํ† ๋ง ๋‚ด์„ฑ์ด ์ „ํ˜€ ์—†๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

 

๐Ÿ’ญ ๊ฒฐ๋ก 

๋ง์€ ์ด๋ ‡๊ฒŒ ํ–ˆ์–ด๋„, ๋ชจ๋“  ์กฐ๊ฑด์„ ์™„๋ฒฝํ•˜๊ฒŒ ์ถฉ์กฑํ•˜๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ๋Š” ์‰ฝ์ง€ ์•Š๋‹ค.

ํŒ์„ ์ฃผ์ž๋ฉด ๋Œ€๋ถ€๋ถ„์˜ ๊ธฐ์—…์šฉ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๋ฆฌํŒฉํ„ฐ๋ง ๋‚ด์„ฑ์€ ํฌ๊ธฐํ•  ์ˆ˜ ์—†๋‹ค. ๋ฆฌํŒฉํ„ฐ๋ง ๋‚ด์„ฑ์€ ์‹ค์ œ ์„œ๋น„์Šค์— ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š”๋ฐ ํฐ ์˜ํ–ฅ์„ ๋ผ์น˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

๋ฆฌํŒฉํ† ๋ง ๋‚ด์„ฑ์„ ๊ฐ€์žฅ ์ค‘์š”ํ•˜๊ฒŒ ๊ณ ๋ คํ•˜๊ณ , ํšŒ๊ท€ ๋ฐฉ์ง€์™€ ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ์„ ์ ์ ˆํ•˜๊ฒŒ ํƒ€ํ˜‘ํ•˜๋Š”๊ฒŒ ์ข‹๋‹ค.

๋‹ค๋งŒ ์ ˆ์ถฉ์•ˆ์„ ์„ ํƒํ•˜๋Š”๊ฑฐ์ง€, ์œ„ ๊ทน๋‹จ์ ์ธ ์‚ฌ๋ก€์ฒ˜๋Ÿผ ํ•œ์ชฝ์„ ์™„์ „ํžˆ ํฌ๊ธฐํ•ด์„œ๋Š” ์ ˆ๋Œ€ ์•ˆ๋œ๋‹ค. ์ข‹์€ ํ…Œ์ŠคํŠธ๋Š” ์–ธ์ œ๋‚˜ 3๊ฐ€์ง€ ์š”์†Œ๋ฅผ ๋‹ค ๊ณ ๋ คํ•ด์•ผํ•œ๋‹ค.

E2E๋Š” ํšŒ๊ท€๋ฐฉ์ง€์— ์œ ๋ฆฌํ•˜๊ณ , ๋‹จ์œ„ํ…Œ์ŠคํŠธ๋Š” ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์— ์œ ๋ฆฌํ•˜๋‹ค.

 

 

ํ…Œ์ŠคํŠธ์˜ ๋ณธ์งˆ์ ์ธ ๋ชฉ์ ์„ ์žŠ์ง€ ๋ง์ž.

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

JiwonDev

JiwonDev

ํ™œ๋™ํ•˜๊ธฐ