Backend/๐ŸŒฑ Spring

[Spring]API ๋กœ๊น…

HS0601 2025. 8. 21. 15:32
API=Application Programming Interface

 

์‰ฝ๊ฒŒ ๋งํ•ด, ํ”„๋กœ๊ทธ๋žจ๋ผ๋ฆฌ ์†Œํ†ตํ•˜๋Š” ์ฐฝ๊ตฌ

 

์˜ˆ) ๋„ค์ด๋ฒ„ ๋‚ ์”จ ์•ฑ-> ๋„ค์ด๋ฒ„ ์„œ๋ฒ„์— ์„œ์šธ ๋‚ ์”จ ์•Œ๋ ค์ค˜ ์š”์ฒญ-> ์„œ๋ฒ„๊ฐ€ ๋‚ ์”จ ๋ฐ์ดํ„ฐ ์‘๋‹ต

 

์—ฌ๊ธฐ์„œ ๋‚ ์”จ ์•ฑ๊ณผ ๋„ค์ด๋ฒ„ ์„œ๋ฒ„ ์‚ฌ์ด์˜ ํ†ต์‹ ์ด API

 

๋กœ๊น…์ด๋ž€?

 

ํ”„๋กœ๊ทธ๋žจ์˜ ๋™์ž‘ ๊ธฐ๋ก

 

ํ”„๋กœ๊ทธ๋žจ์ด ์–ธ์ œ, ์–ด๋–ค ์ผ์„ ํ–ˆ๋Š”์ง€ ๊ธฐ๋กํ•˜๋Š” ๊ฒƒ

 

์˜ˆ) ์‚ฌ์šฉ์ž A๊ฐ€ ๋กœ๊ทธ์ธ ์‹œ๋„ํ•จ, ์‚ฌ์šฉ์ž B๊ฐ€ ๋กœ๊ทธ์ธ ์‹œ๋„ํ•จ

 

์ฆ‰, ๋‚˜์ค‘์— ๋ฌธ์ œ ๋ฐœ์ƒ ์‹œ ์›์ธ ์ถ”์ ํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉ ํŒจํ„ด ๋ถ„์„ํ•  ๋•Œ ์‚ฌ์šฉ

 

 

API๋กœ๊น…์ด๋ž€?

 

API๋ฅผ ์‚ฌ์šฉํ•œ ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ๊ธฐ๋กํ•˜๋Š” ๊ฒƒ

 

์ด๋ฒˆ ๊ณผ์ œ์—์„œ๋Š” ์–ด๋“œ๋ฏผ ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • API๋ฅผ ํ˜ธ์ถœํ–ˆ์„ ๋•Œ๋งŒ ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธฐ๋Š” ๊ฒƒ

 

 

API๋กœ๊น…์ด ํ•„์š”ํ•œ ์ด์œ 

 

๋ฌธ์ œ ์ถ”์ฒ™: ๋ˆ„๊ฐ€ ์–ธ์ œ ๋ฌด์Šจ ์š”์ฒญ์„ ํ•ด์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Œ

 

๋ณด์•ˆ: ๊ด€๋ฆฌ์ž๊ฐ€ ์•„๋‹Œ ์‚ฌ๋žŒ์ด ๋ฏผ๊ฐํ•œ API๋ฅผ ํ˜ธ์ถœํ–ˆ๋Š”์ง€ ํ™•์ธ ๊ฐ€๋Šฅ

 

์‚ฌ์šฉ์ž ํŒจํ„ด ๋ถ„์„: ์–ด๋–ค API๊ฐ€ ๋งŽ์ด ์“ฐ์ด๋Š”์ง€ ์„ฑ๋Šฅ ๋ฌธ์ œ๋Š” ์—†๋Š”์ง€ ๋ถ„์„ ๊ฐ€๋Šฅ

 

Interceptor VS AOP

 

1. Interceptor

 

API๊ฐ€ ์‹ค์ œ ์‹คํ–‰๋˜๊ธฐ ์ „์— ์š”์ฒญ์„ ์žก๊ณ  ์‹ถ์„ ๋•Œ

 

ํŠน์ง•์œผ๋กœ๋Š” ์š”์ฒญ ์ •๋ณด(HttpServletRequest) ์ ‘๊ทผ ๊ฐ€๋Šฅ, ์ธ์ฆ/๊ถŒํ•œ ์ฒดํฌ ์šฉ๋„์ž„

 

 

2. AOP

 

๋ฉ”์„œ๋“œ ์‹คํ–‰ ์ „ํ›„๋ฅผ ๊ฐ€๋กœ์ฑ„์„œ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ

 

ํŠน์ง•์œผ๋กœ๋Š” ๋ฉ”์„œ๋“œ ํŒŒ๋ผ๋ฏธํ„ฐ/ ๋ฆฌํ„ด ๊ฐ’๊นŒ์ง€ ์ ‘๊ทผ ๊ฐ€๋Šฅ, ๋กœ๊น…, ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ ๋“ฑ์— ํ™œ์šฉ

 

์‰ฝ๊ฒŒ ๋งํ•ด, Interceptor๋Š” ๋ฌธ ์•ž์—์„œ ์‹ ๋ถ„์ฆ ํ™•์ธ, AOP๋Š” ๋ฌธ ์•ž์—์„œ ํ–‰๋™ ๊ฐ์‹œํ•˜๊ณ  ๊ธฐ๋ก

 

 

Interceptor๋ฅผ ํ™œ์šฉํ•œ API ๋กœ๊น…

 

์–ด๋–ค ์—ญํ• ์ธ๊ฐ€?

  • ์š”์ฒญ์ด ์ปจํŠธ๋กค๋Ÿฌ์— ๋„์ฐฉํ•˜๊ธฐ ์ „์— ์‚ฌ์šฉ์ž ๊ถŒํ•œ ํ™•์ธ
  • ์–ด๋“œ๋ฏผ์ธ์ง€ ์•„๋‹Œ์ง€ ํŒ๋‹จ
  • ์–ด๋“œ๋ฏผ์ด๋ฉด ๋กœ๊ทธ ๊ธฐ๋ก
  • ์•„๋‹ˆ๋ฉด ์ ‘๊ทผ ์ฐจ๋‹จ
@Component
public class AdminInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response,
                             Object handler) throws Exception {
        // ๊ถŒํ•œ ์ฒดํฌ ๋ฐ ๋กœ๊ทธ ๊ธฐ๋ก
        return true; // ํ—ˆ์šฉ/false: ์ฐจ๋‹จ
    }
}

 

 

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new AdminInterceptor())
                .addPathPatterns("/admin/**"); // ์ ์šฉ ๊ฒฝ๋กœ
    }
}

 

AOP๋ฅผ ํ™œ์šฉํ•œ API ๋กœ๊น…

 

์–ด๋–ค ์—ญํ• ์ธ๊ฐ€?

  • ๋ฉ”์„œ๋“œ ์‹คํ–‰ ์ „ํ›„๋ฅผ ๊ฐ์‹œ
  • ์š”์ฒญ ๋ณธ๋ฌธ(RequestBody)๊ณผ ์‘๋‹ต ๋ณธ๋ฌธ(ResponseBody)๊นŒ์ง€ ๊ธฐ๋ก๊ฐ€๋Šฅ
  • ์ฆ‰, ๋ˆ„๊ฐ€, ์–ธ์ œ, ๋ฌด์—‡์„ ์š”์ฒญํ–ˆ๊ณ  ๊ฒฐ๊ณผ๊ฐ€ ๋ฌด์—‡์ธ์ง€๊นŒ์ง€ ๋‚จ๊น€
@Aspect
@Component
public class AdminLoggingAspect {

    @Around("execution(* ํŒจํ‚ค์ง€๋ช…..controller.*AdminController.*(..))")
    public Object logAdminApi(ProceedingJoinPoint joinPoint) throws Throwable {
        // ์‹คํ–‰ ์ „: joinPoint.getArgs() → ์š”์ฒญ ๋ฐ์ดํ„ฐ
        Object result = joinPoint.proceed(); // ๋ฉ”์„œ๋“œ ์‹คํ–‰
        // ์‹คํ–‰ ํ›„: result → ์‘๋‹ต ๋ฐ์ดํ„ฐ
        return result;
    }
}

 

 


 

Interceptorํ๋ฆ„

 

1. ํด๋ผ์ด์–ธํŠธ๊ฐ€ /admin/deleteComment์š”์ฒญ

 

2. DispatchServlet์ด ์š”์ฒญ์„ ๋ฐ›์Œ

 

3. AdminInterceptor(preHandle)์‹คํ–‰
- ์‚ฌ์šฉ์ž ์ •๋ณด ํ™•์ธ
- ๊ถŒํ•œ ์ฒดํฌ(์–ด๋“œ๋ฏผ์ธ์ง€?)
- ์–ด๋“œ๋ฏผ์ด๋ฉด ๋กœ๊ทธ ๊ธฐ๋ก
- ์–ด๋“œ๋ฏผ ์•„๋‹ˆ๋ฉด ์˜ˆ์™ธ๋ฐœ์ƒ/ ์ ‘๊ทผ ์ฐจ๋‹จ

 

4. ์ปจํŠธ๋กค๋Ÿฌ ์‹คํ–‰(deleteComment())

 

5. ์ปจํŠธ๋กค๋Ÿฌ ์‘๋‹ต

 

6. AdminInterceptor(postHandle/ afterCompletion) ์‹คํ–‰ ๊ฐ€๋Šฅ
- ์ถ”๊ฐ€ ๋กœ๊น…์ด๋‚˜ ํ›„ ์ฒ˜๋ฆฌ

 

7. ํด๋ผ์ด์–ธํŠธ๋กœ ์‘๋‹ต ์ „์†ก

Interceptor ํ•ต์‹ฌ ์—ญํ• : ๊ถŒํ•œ ์ฒดํฌ + ์š”์ฒญ ์ „/ํ›„ ๋กœ๊ทธ ๊ธฐ๋ก

 

AOPํ๋ฆ„

 

1. ํด๋ผ์ด์–ธํŠธ๊ฐ€ /admin/deleteComment ์š”์ฒญ

 

2. ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์‹œ์ ์—์„œ AOP @Around๊ฐ€๋กœ์ฑ„๊ธฐ

  • Before ์‹คํ–‰
    • ์š”์ฒญํ•œ ์‚ฌ์šฉ์ž ID
    • ์š”์ฒญ URL
    • ์š”์ฒญ ๋ณธ๋ฌธ(RequestBody)
    • ์š”์ฒญ ์‹œ๊ฐ
    • ๋กœ๊ทธ๋ถ„์„
  • Proceed -> ์‹ค์ œ ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์„œ๋“œ ์‹คํ–‰
  • After์‹คํ–‰
    • ์ปจํŠธ๋กค๋Ÿฌ ์‘๋‹ต(ResponseBody)
    • ์‘๋‹ต ์‹œ๊ฐ
    • ๋กœ๊ทธ ๊ธฐ๋ก
AOP ํ•ต์‹ฌ ์—ญํ• : ๋ฉ”์„œ๋“œ ์‹คํ–‰ ์ „/ํ›„ ๊ฐ์‹œ + ์š”์ฒญ/์‘๋‹ต ๋ฐ์ดํ„ฐ ๋กœ๊ทธ

 

 

API ๋กœ๊น… ์‹œ๊ฐํ™”: Interceptor vs AOP
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚   ํด๋ผ์ด์–ธํŠธ      โ”‚
โ”‚ (์›น/์•ฑ ์š”์ฒญ)      โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
          โ”‚
          โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ DispatcherServletโ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
          โ”‚
          โ–ผ
 โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
 โ”‚      Interceptor        โ”‚
 โ”‚-------------------------โ”‚
 โ”‚ preHandle()             โ”‚
 โ”‚ - ๊ถŒํ•œ ์ฒดํฌ (์–ด๋“œ๋ฏผ?)    โ”‚
 โ”‚ - ๋กœ๊ทธ ๊ธฐ๋ก (URL, ์‹œ๊ฐ)  โ”‚
 โ”‚                         โ”‚
 โ”‚ postHandle()            |
 |  /afterCompletion()     โ”‚
 โ”‚ - ํ›„์ฒ˜๋ฆฌ ๋กœ๊ทธ ๊ธฐ๋ก       โ”‚
 โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
          โ”‚
          โ–ผ
 โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
 โ”‚      Controller         โ”‚
 โ”‚-------------------------โ”‚
 โ”‚ deleteComment() /       โ”‚
 โ”‚ changeUserRole()        โ”‚
 โ”‚ ์‹ค์ œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ˆ˜ํ–‰  โ”‚
 โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
          โ”‚
          โ–ผ
 โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
 โ”‚          AOP            โ”‚
 โ”‚-------------------------โ”‚
 โ”‚ @Around                 โ”‚
 โ”‚ Before:                 โ”‚
 โ”‚ - ์‚ฌ์šฉ์ž ID             โ”‚
 โ”‚ - ์š”์ฒญ URL              โ”‚
 โ”‚ - RequestBody           โ”‚
 โ”‚ - ์š”์ฒญ ์‹œ๊ฐ             โ”‚
 โ”‚ proceed() → ์‹ค์ œ ๋ฉ”์„œ๋“œ ์‹คํ–‰ โ”‚
 โ”‚ After:                  โ”‚
 โ”‚ - ResponseBody          โ”‚
 โ”‚ - ์‘๋‹ต ์‹œ๊ฐ              โ”‚
 โ”‚ - ๋กœ๊ทธ ๊ธฐ๋ก              โ”‚
 โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
          โ”‚
          โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚   ํด๋ผ์ด์–ธํŠธ      โ”‚
โ”‚ (์‘๋‹ต ์ˆ˜์‹ )       โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜