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

2022.03.18~03.20์˜ ๊ธฐ๋ก

by GroovyArea 2022. 3. 19.

โ–ถ 3์ผ ๊ณ„ํš

 

=>  ๊ณต๋ถ€ ๊ด€๋ จ

1) ์ˆ˜์—…(18์ผ ์ˆ˜์—…) ๋‚ด์šฉ ๋ณต์Šต

2) MVC ๊ฐ•์˜ ๊ฒฐ์ œ

3) ์Šคํ”„๋ง ๊ธฐ์ˆ  ์™„๊ฐ•

4) MVC ๊ฐ•์˜ ์ˆ˜๊ฐ•

ํ•ต์‹ฌ ๊ฐ•์˜ ์™„๊ฐ•

 

=> ์ทจ์ค€

1) ๋ฆฌํŒฉํ† ๋ง ๋งˆ๋ฌด๋ฆฌ ํ›„ ๊นƒ ํ‘ธ์‰ฌ

2) ๋ฏธํก ์งˆ๋ฌธ ๋‹ต๋ณ€ ์ฑ„์šฐ๊ธฐ(ํ•œ ๋ฌธ์žฅ์œผ๋กœ ์ •๋ฆฌ)

3) ์ˆ˜๊ฐ• ๊ฐ•์˜ ๋‚ด์šฉ ๋…ธ์…˜ ์ •๋ฆฌ


โ–ถ ๋ฌธ์ œ ์ •๋ฆฌ

1. JoinPoint & PointCut์˜ ๊ฐœ๋… ํ˜ผ๋™

์กฐ์ธํฌ์ธํŠธ๊ฐ€ ๋ฉ”ํƒ€์ ์ธ ์ •๋ณด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋˜๊ณ  ํฌ์ธํŠธ์ปท์ด ์ข€ ๋” ๊ตฌ์ฒด์ ์ธ ์ ์šฉ ์ง€์ ์ด๋‹ค!

 

2. MVC ๋ฆฌํŒฉํ† ๋ง์—์„œ Computer ๊ฐ์ฒด ์ฃผ์ž… ์‹œ์ ์˜ ๋ฌธ์ œ

Controller์—์„œ ์ƒ์„ฑ ํ›„ ์ฃผ์ž…ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •


โ–ถ ๊ฐœ์ธ ๊ณต๋ถ€

YML์˜ ๋œป์ด๋‹ค. ์ธ๊ฐ„ ์นœํ™”์ ์ธ ํ”„๋กœํผํ‹ฐ ํŒŒ์ผ์˜ ๋ณ€ํ˜•
์Šคํ”„๋ง ๋ถ€ํŠธ์˜ ํŠน์ง• ์ถœ์ฒ˜: ์šฐ์•„ํ•œ ํ…Œํฌ์ฝ”์Šค

 

๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ ์ถ”์ƒํ™”: Converter์™€ Formatter

public class EventConverter {

    public static class StringToEventConverter implements Converter<String, Event> {

        @Override
        public Event convert(String source) {
            return new Event(Integer.parseInt(source));
        }

        public static class EventToStringConverter implements Converter<Event, String>{
            @Override
            public String convert(Event source) {
                return source.getId().toString();
            }
        }
    }
}

=> Event, String Type๊ฐ„์˜ ์ปจ๋ฒ„ํŒ…ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•œ ๋ชจ์Šต

 

&amp;amp;amp;amp;amp;amp;amp;nbsp;Converter๋ฅผ bean์œผ๋กœ ๋“ฑ๋กํ•œ ๋ชจ์Šต
์ž˜ ์ฐํžŒ๋‹ค! (Event -&amp;amp;amp;amp;amp;amp;amp;gt; String)
๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Fomatter์„ bean ๋“ฑ๋กํ•œ ๊ฒฝ์šฐ๋„ ์ž˜ ๋œ๋‹ค.

 

AOP ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์œ„ํ•œ ํ”„๋ก์‹œํŒจํ„ด

@Component
public class AppRunner implements ApplicationRunner {

    @Autowired
    EventService eventService;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        eventService.createEvent();
        eventService.publishEvent();
        eventService.deleteEvent();
    }
}

=> service ๊ฐ์ฒด๋กœ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ

 

@Around ๋ฉ”์„œ๋“œ๋ฅผ ์„ ์–ธํ•˜๋ฉด ์ธํ…”๋ฆฌ์ œ์ด๋Š” ํƒ€๊ฒŸ๋ฉ”์„œ๋“œ๋“ค์„ ๋‹ค ๋ณด์—ฌ์ค€๋‹ค ใ„ทใ„ท

@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.CLASS)
public @interface PerfLogging {
}

=> ํƒ€๊ฒŸ ๋ฉ”์„œ๋“œ๋ฅผ ์œ„ํ•œ ์—๋„ˆํ…Œ์ด์…˜ ์ •์˜

@Retention์˜ ์†์„ฑ 

1. Runtime ์‹œ ๊นŒ์ง€ ์œ ์ง€

2. Class ๋ฐ”์ดํŠธ ์ฝ”๋“œ ๋กœ๋“œ ๋  ๋•Œ๊นŒ์ง€ ์œ ์ง€

3. Source ์†Œ์Šค ์ฝ”๋“œ ์ƒํƒœ ์œ ์ง€

์—๋„ˆํ…Œ์ด์…˜ ์†์„ฑ PerfLogging ์—๋„ˆํ…Œ์ด์…˜์ด ๋‹ฌ๋ฆฐ ํƒ€๊ฒŸ์—๋งŒ ์‹คํ–‰ํ•ด๋ผ!

 

 

โ— ๊ฐ•์˜ ์ •๋ฆฌ โ— 

๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ ์ถ”์ƒํ™”: Converter์™€ Formatter

Converter

โ— S ํƒ€์ž…์„ T ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋งค์šฐ ์ผ๋ฐ˜์ ์ธ ๋ณ€ํ™˜๊ธฐ.

โ— ์ƒํƒœ ์ •๋ณด ์—†์Œ == Stateless == ์“ฐ๋ ˆ๋“œ์„ธ์ดํ”„

โ— ConverterRegistry์— ๋“ฑ๋กํ•ด์„œ ์‚ฌ์šฉ

public class StringToEventConverter implements Converter<String, Event> {
@Override
public Event convert(String source) {
Event event = new Event();
event.setId(Integer.parseInt(source));
return event;
}
}

Formatter

โ— PropertyEditor ๋Œ€์ฒด์ œ

โ— Object์™€ String ๊ฐ„์˜ ๋ณ€ํ™˜์„ ๋‹ด๋‹นํ•œ๋‹ค.

โ— ๋ฌธ์ž์—ด์„ Locale์— ๋”ฐ๋ผ ๋‹ค๊ตญํ™”ํ•˜๋Š” ๊ธฐ๋Šฅ๋„ ์ œ๊ณตํ•œ๋‹ค. (optional)

โ— FormatterRegistry์— ๋“ฑ๋กํ•ด์„œ ์‚ฌ์šฉ

public class EventFormatter implements Formatter<Event> {
@Override
public Event parse(String text, Locale locale) throws ParseException {
Event event = new Event();
int id = Integer.parseInt(text);
event.setId(id);
return event;
}
@Override
public String print(Event object, Locale locale) {
return object.getId().toString();
}
}

ConversionService

โ— ์‹ค์ œ ๋ณ€ํ™˜ ์ž‘์—…์€ ์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด์„œ ์“ฐ๋ ˆ๋“œ-์„ธ์ดํ”„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ.

โ— ์Šคํ”„๋ง MVC, ๋นˆ (value) ์„ค์ •, SpEL์—์„œ ์‚ฌ์šฉํ•œ๋‹ค.

โ— DefaultFormattingConversionService

โ— FormatterRegistry

โ— ConversionService

โ— ์—ฌ๋Ÿฌ ๊ธฐ๋ณธ ์ปด๋ฒ„ํ„ฐ์™€ ํฌ๋งคํ„ฐ ๋“ฑ๋ก ํ•ด ์คŒ.

 

 

์Šคํ”„๋ง ๋ถ€ํŠธ

โ— ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ธ ๊ฒฝ์šฐ์— DefaultFormattingConversionSerivce๋ฅผ ์ƒ์†ํ•˜์—ฌ ๋งŒ๋“  WebConversionService๋ฅผ ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•ด ์ค€๋‹ค.

โ— Formatter์™€ Converter ๋นˆ์„ ์ฐพ์•„ ์ž๋™์œผ๋กœ ๋“ฑ๋กํ•ด ์ค€๋‹ค

 

SpEL (์Šคํ”„๋ง Expression Language)

์Šคํ”„๋ง EL์ด๋ž€?

โ— ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„๋ฅผ ์กฐํšŒํ•˜๊ณ  ์กฐ์ž‘ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

โ— Unified EL๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ, ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ์„ ์ง€์›ํ•˜๋ฉฐ, ๋ฌธ์ž์—ด ํ…œํ”Œ๋ฆฟ ๊ธฐ๋Šฅ๋„ ์ œ๊ณตํ•œ๋‹ค.

โ— OGNL, MVEL, JBOss EL ๋“ฑ ์ž๋ฐ”์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ EL์ด ์žˆ์ง€๋งŒ, SpEL์€ ๋ชจ๋“  ์Šคํ”„๋ง ํ”„๋กœ์ ํŠธ ์ „๋ฐ˜์— ๊ฑธ์ณ ์‚ฌ์šฉํ•  EL๋กœ ๋งŒ๋“ค์—ˆ๋‹ค.

โ— ์Šคํ”„๋ง 3.0 ๋ถ€ํ„ฐ ์ง€์›.

 

SpEL ๊ตฌ์„ฑ

โ— ExpressionParser parser = new SpelExpressionParser()

โ— StandardEvaluationContext context = new StandardEvaluationContext(bean)

โ— Expression expression = parser.parseExpression(“SpEL ํ‘œํ˜„์‹”)

โ— String value = expression.getvalue(context, String.class)

 

๋ฌธ๋ฒ•

โ— #{“ํ‘œํ˜„์‹"}

โ— ${“ํ”„๋กœํผํ‹ฐ"}

โ— ํ‘œํ˜„์‹์€ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ฐ˜๋Œ€๋Š” ์•ˆ ๋จ. โ—‹ #{${my.data} + 1}

โ— ๋ ˆํผ๋Ÿฐ์Šค ์ฐธ๊ณ 

 

์‹ค์ œ๋กœ ์–ด๋””์„œ ์“ฐ๋‚˜?

โ— @Value ์• ๋…ธํ…Œ์ด์…˜

โ— @ConditionalOnExpression ์• ๋…ธํ…Œ์ด์…˜

โ— ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ

โ—‹ ๋ฉ”์†Œ๋“œ ์‹œํ๋ฆฌํ‹ฐ, @PreAuthorize, @PostAuthorize, @PreFilter, @PostFilter โ—‹ XML ์ธํ„ฐ์…‰ํ„ฐ URL ์„ค์ • โ—‹ ...

โ— ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ

โ—‹ @Query ์• ๋…ธํ…Œ์ด์…˜

โ— Thymeleaf โ— ...

์Šคํ”„๋ง AOP: ๊ฐœ๋… ์†Œ๊ฐœ

Aspect-oriendted Programming (AOP)์€ OOP๋ฅผ ๋ณด์™„ํ•˜๋Š” ์ˆ˜๋‹จ์œผ๋กœ, ํฉ์–ด์ง„ Aspect๋ฅผ ๋ชจ๋“ˆํ™” ํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ•.

 

 

AOP ์ฃผ์š” ๊ฐœ๋…

โ— Aspect์™€ Target

โ— Advice

โ— Join point์™€ Pointcut

 

AOP ๊ตฌํ˜„์ฒด

โ— https://en.wikipedia.org/wiki/Aspect-oriented_programming

โ— ์ž๋ฐ” โ—‹ AspectJ โ—‹ ์Šคํ”„๋ง AOP

 

Aspect-oriented programming - Wikipedia

Programming paradigm In computing, aspect-oriented programming (AOP) is a programming paradigm that aims to increase modularity by allowing the separation of cross-cutting concerns. It does so by adding behavior to existing code (an advice) without modifyi

en.wikipedia.org

AOP ์ ์šฉ ๋ฐฉ๋ฒ•

โ— ์ปดํŒŒ์ผ

โ— ๋กœ๋“œ ํƒ€์ž„

โ— ๋Ÿฐํƒ€์ž„

์Šคํ”„๋ง AOP: ํ”„๋ก์‹œ ๊ธฐ๋ฐ˜ AOP

์Šคํ”„๋ง AOP ํŠน์ง•

โ— ํ”„๋ก์‹œ ๊ธฐ๋ฐ˜์˜ AOP ๊ตฌํ˜„์ฒด

โ— ์Šคํ”„๋ง ๋นˆ์—๋งŒ AOP๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

โ— ๋ชจ๋“  AOP ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ๋ชฉ์ ์ด ์•„๋‹ˆ๋ผ, ์Šคํ”„๋ง IoC์™€ ์—ฐ๋™ํ•˜์—ฌ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๊ฐ€์žฅ ํ”ํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ๋ชฉ์ .

 

ํ”„๋ก์‹œ ํŒจํ„ด

โ— ์™œ? (๊ธฐ์กด ์ฝ”๋“œ ๋ณ€๊ฒฝ ์—†์ด) ์ ‘๊ทผ ์ œ์–ด ๋˜๋Š” ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

โ— ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ  ์„ฑ๋Šฅ์„ ์ธก์ •ํ•ด ๋ณด์ž. (ํ”„๋ก์‹œ ํŒจํ„ด์œผ๋กœ)

 

๋ฌธ์ œ์ 

โ— ๋งค๋ฒˆ ํ”„๋ก์‹œ ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š”๊ฐ€?

โ— ์—ฌ๋Ÿฌ ํด๋ž˜์Šค ์—ฌ๋Ÿฌ ๋ฉ”์†Œ๋“œ์— ์ ์šฉํ•˜๋ ค๋ฉด?

โ— ๊ฐ์ฒด๋“ค ๊ด€๊ณ„๋„ ๋ณต์žกํ•˜๊ณ ...

 

๊ทธ๋ž˜์„œ ๋“ฑ์žฅํ•œ ๊ฒƒ์ด ์Šคํ”„๋ง AOP

โ— ์Šคํ”„๋ง IoC ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋ฐ˜ ์‹œ์„ค๊ณผ Dynamic ํ”„๋ก์‹œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ๋ณต์žกํ•œ ๋ฌธ์ œ ํ•ด๊ฒฐ.

โ— ๋™์  ํ”„๋ก์‹œ: ๋™์ ์œผ๋กœ ํ”„๋ก์‹œ ๊ฐ์ฒด ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•

โ—‹ ์ž๋ฐ”๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ๋ฐ˜ ํ”„๋ก์‹œ ์ƒ์„ฑ. โ—‹ CGlib์€ ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ํ”„๋ก์‹œ๋„ ์ง€์›.

โ— ์Šคํ”„๋ง IoC: ๊ธฐ์กด ๋นˆ์„ ๋Œ€์ฒดํ•˜๋Š” ๋™์  ํ”„๋ก์‹œ ๋นˆ์„ ๋งŒ๋“ค์–ด ๋“ฑ๋ก ์‹œ์ผœ์ค€๋‹ค.

โ—‹ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ ๋ณ€๊ฒฝ ์—†์Œ. โ—‹ AbstractAutoProxyCreator implements BeanPostProcessor

์Šคํ”„๋ง AOP: @AOP

์• ๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜์˜ ์Šคํ”„๋ง @AOP ์˜์กด์„ฑ ์ถ”๊ฐ€

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>

์• ์ŠคํŒฉํŠธ ์ •์˜

โ— @Aspect

โ— ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•ด์•ผ ํ•˜๋‹ˆ๊นŒ (์ปดํฌ๋„ŒํŠธ ์Šค์บ”์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด) @Component๋„ ์ถ”๊ฐ€.

 

ํฌ์ธํŠธ์ปท ์ •์˜

โ— @Pointcut(ํ‘œํ˜„์‹)

โ— ์ฃผ์š” ํ‘œํ˜„์‹

โ—‹ execution โ—‹ @annotation โ—‹ bean

โ— ํฌ์ธํŠธ์ปท ์กฐํ•ฉ

โ—‹ &&, ||, !

 

์–ด๋“œ๋ฐ”์ด์Šค ์ •์˜

โ— @Before

โ— @AfterReturning

โ— @AfterThrowing

โ— @Around

 

์ฐธ๊ณ 

โ— https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#aoppointcuts

Null-safety

์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ 5์— ์ถ”๊ฐ€๋œ Null ๊ด€๋ จ ์• ๋…ธํ…Œ์ด์…˜

โ— @NonNull

โ— @Nullable

โ— @NonNullApi (ํŒจํ‚ค์ง€ ๋ ˆ๋ฒจ ์„ค์ •)

โ— @NonNullFields (ํŒจํ‚ค์ง€ ๋ ˆ๋ฒจ ์„ค์ •)

 

๋ชฉ์ 

โ— (ํˆด์˜ ์ง€์›์„ ๋ฐ›์•„) ์ปดํŒŒ์ผ ์‹œ์ ์— ์ตœ๋Œ€ํ•œ NullPointerException์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ชฉ์ 

 

 

โ—Ž GitHub 

๊นƒ ํ—ˆ๋ธŒ ์ €์žฅ์†Œ ์ •๋ฆฌ 2๋ฒˆ์งธ, 4๋ฒˆ์งธ ์ €์žฅ์†Œ๋„ ์กฐ๋งŒ๊ฐ„ ์ •๋ฆฌํ•ด์•ผ๊ฒ ๋‹ค


โ–ถ ์ˆ˜์—… ๋‚ด์šฉ

 

Spring MVC

Controller ํด๋ž˜์Šค

  • ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ํด๋ž˜์Šค - ์›นํ”„๋กœ๊ทธ๋žจ@Request Mapping ์—๋„ˆํ…Œ์ด์…˜์„ ํด๋ž˜์Šค์— ์„ ์–ธํ•˜๋ฉด Controller ํด๋ž˜์Šค์˜ ๋ชจ๋“  ์š”์ฒญ ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ์˜ ์š”์ฒญ URL ์ฃผ์†Œ์•ž๋ถ€๋ถ„์— ๊ณตํ†ต์ ์œผ๋กœ ํฌํ•จ๋˜๋Š” URL ์ฃผ์†Œ๋ฅผ ์„ค์ • ๊ฐ€๋Šฅ

MyBatis Framework์—์„œ ๋กœ๊ทธ๋ฅผ ์ œ๊ณต๋˜๋Š” Spring ๋กœ๊ทธ ๊ตฌํ˜„์ฒด๋กœ ๊ธฐ๋ก๋˜๋„๋ก ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•

1. Log4Jdbc Log4j2 JDBC4 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ”„๋กœ์ ํŠธ์— ๋นŒ๋“œ ์ฒ˜๋ฆฌ - pom.xml

2. DataSource ๊ด€๋ จ ํด๋ž˜์Šค๋ฅผ spring bean์œผ๋กœ ๋“ฑ๋กํ•œ bean ์—˜๋ฆฌ๋จผํŠธ์—์„œ driverClassName ํ•„๋“œ๊ฐ’๊ณผ URL ํ•„๋“œ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜์—ฌ ์ธ์ ์…˜ ์ฒ˜๋ฆฌ - root-context.xml

3. [src/main/resources] ํด๋”์— log4jdbc.log4j2.properites ํŒŒ์ผ ์ž‘์„ฑ

4. [src/main/resources] ํด๋”์˜ log4j.xml ํŒŒ์ผ์—์„œ ๋กœ๊ทธ ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ๊ธฐ๋ก ์„ค์ •

  • jdbc.sqltiming : SQL ๋ช…๋ น ์‹คํ–‰์‹œ๊ฐ„(ms) ๊ธฐ๋ก
  • jdbc.audit : ResultSet ๊ด€๋ จ ์ •๋ณด๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  JDBC ๊ด€๋ จ ์ •๋ณด ๊ธฐ๋ก
  • jdbc.resultset : ResultSet ๊ด€๋ จ ์ •๋ณด๋ฅผ ํฌํ•จํ•œ ๋ชจ๋“  JDBC ๊ด€๋ จ ์ •๋ณด ๊ธฐ๋ก
  • jdbc.resultsettable : ResultSet ๊ด€๋ จ ์ •๋ณด๋ฅผ ํ…Œ์ด๋ธ”(ํ‘œ) ํ˜•์‹์œผ๋กœ ๊ธฐ๋ก
  • jdbc.connection : Connection ๊ด€๋ จ ์ •๋ณด๋ฅผ ๊ธฐ๋ก - Open or Close

Spring Framework๋ฅผ ์ด์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ด ๋ชจ๋“ˆ(๋‹จ์œ„ ํ”„๋กœ๊ทธ๋žจ) ํ…Œ์ŠคํŠธ ํ•˜๋Š” ๋ฐฉ๋ฒ•

1. junit ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ spring-test ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ”„๋กœ์ ํŠธ์— ๋นŒ๋“œ ์ฒ˜๋ฆฌ - pom.xml

⇒ junit ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ spring-test ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ scope ์—˜๋ฆฌ๋จผํŠธ ์ฃผ์„ ์ฒ˜๋ฆฌ

2. [src/test/resources] ํด๋”์˜ log4j.xml ํŒŒ์ผ ๋ณ€๊ฒฝ

3. [src/test/java] ํด๋”์— ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค ์ž‘์„ฑ - ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ ์ด์šฉํ•˜์—ฌ ๋ชจ๋“ˆ ํ…Œ์ŠคํŠธ

pom.xml

https://mvnrepository.com/artifact/org.bgee.log4jdbc-log4j2/log4jdbc-log4j2-jdbc4

  • DAO ๊ด€๋ จ Framework์—์„œ ๋ฐœ์ƒ๋˜๋Š” ๋กœ๊ทธ๋ฅผ Spring Log ๊ตฌํ˜„์ฒด์—๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

Test

  • ํ…Œ์ŠคํŠธ ํ”„๋กœ๊ทธ๋žจ์€ DAO ํด๋ž˜์Šค ๋˜๋Š” Service ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฒ€์‚ฌํ•  ๋ชฉ์ ์œผ๋กœ ์ž‘์„ฑ
    • ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ํด๋ž˜์Šค(Clazz)๋ฅผ ์„ค์ •ํ•˜๋Š” ์—๋„ˆํ…Œ์ด์…˜
    • value ์†์„ฑ : ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•œ ํด๋ž˜์Šค(clazz)๋ฅผ ์†์„ฑ๊ฐ’์œผ๋กœ ์„ค์ • - ๋‹ค๋ฅธ ์†์„ฑ์ด ์—†๋Š” ๊ฒฝ์šฐ ์†์„ฑ๊ฐ’๋งŒ ์„ค์ •
    • SpringJUnit4ClassRunner : Spring Container (ApplicationContext ๊ฐ์ฒด)๋ฅผ ์ƒ์„ฑํ•˜์—ฌ Spring Bean์„ ์ œ๊ณตํ•˜์—ฌ ํ…Œ์ŠคํŠธ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋Š” ํด๋ž˜์Šค
    @ContextConfiguration
    • ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค์—์„œ ์‚ฌ์šฉ๋  Spring Bean์ด ๋“ฑ๋ก๋œ Bean Configuration File ์—๋„ˆํ…Œ์ด์…˜
    • locations ์†์„ฑ : Bean Configuration File์„ ๋ฐฐ์—ด์˜ ์š”์†Œ๋กœ ์„ค์ •ํ•˜์—ฌ ์†์„ฑ๊ฐ’์œผ๋กœ ์„ค์ •
    • ⇒ Bean Configuration File ๊ฒฝ๋กœ๋Š” file ์ ‘๋‘์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ ์‹œ์Šคํ…œ ๊ฒฝ๋กœ๋กœ ํ‘œํ˜„
    @Test
    • ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ๋ฅผ ์„ค์ •ํ•˜๋Š” ์—๋„ˆํ…Œ์ด์…˜
    • ⇒ Runner ํด๋ž˜์Šค์— ์˜ํ•ด ํ˜ธ์ถœ๋˜์–ด ๋ช…๋ น์ด ์‹คํ–‰๋˜๋Š” ๋ฉ”์„œ๋“œ
    @WebAppConfiguration
    • WebApplicationContext ๊ฐ์ฒด(Spring Container)๋ฅผ ์ด์šฉํ•˜์—ฌ Spring Bean์„ ๊ด€๋ฆฌํ•˜๋„๋ก ์„ค์ •ํ•˜๋Š” ์—๋„ˆํ…Œ์ด์…˜
    MockMvc
    • ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ๊ฐ€์ƒ์œผ๋กœ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•œ ํด๋ž˜์Šค
    @Before
    • ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์ „ ์‹คํ–‰๋  ๋ช…๋ น์„ ์ž‘์„ฑํ•œ ๋ฉ”์„œ๋“œ์— ์„ค์ •ํ•˜๋Š” ์—๋„ˆํ…Œ์ด์…˜ - ์ดˆ๊ธฐํ™” ์ž‘์—…
    MockMvcBuilders.webAppContextSetup(WebApplicationContext context)
    • MockMvcBuilder ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๋ฉ”์„œ๋“œ
    • build() : MockMvc ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ
    MockMvc.perform(RequestBuilder requestBuilder)
    • ๊ฐ€์ƒ์œผ๋กœ ์›นํ”„๋กœ๊ทธ๋žจ์„ ์š”์ฒญํ•˜๋Š” ๋ฉ”์„œ๋“œ
    • ⇒ ResultActions ๊ฐ์ฒด ๋ฐ˜ํ™˜ (์š”์ฒญ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•œ ๊ฐ์ฒด)
    • MockMvcRequestBuilders.get(String urlTemplate, Object... uriVars)
    • RequestBuilder ๊ฐ์ฒด ๋ฐ˜ํ™˜ (์›นํ”„๋กœ๊ทธ๋žจ์˜ ์š”์ฒญ์ •๋ณด๋ฅผ ์ €์žฅํ•œ ๊ฐ์ฒด)
    • ResultActions.addReturn() : ์š”์ฒญ ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ์˜ ๊ฒฐ๊ณผ๋ฅผ MvcResult ๊ฐ์ฒด๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ
  • @RunWith
๋ฐ˜์‘ํ˜•

'Legacy' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

2022.04.18 ์˜ค๋Š˜์˜ ๊ธฐ๋ก  (0) 2022.04.18
2022.04.16 ์˜ ๊ธฐ๋ก  (0) 2022.04.16
2022.03.17์˜ ๊ธฐ๋ก  (2) 2022.03.17
2022.03.16์˜ ๊ธฐ๋ก  (0) 2022.03.16
2022.03.15์˜ ๊ธฐ๋ก  (0) 2022.03.15