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

Spring AOP๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ ์ •๋ณด ๋กœ๊น…ํ•˜๊ธฐ

by ์ฃผ๋ฐœ2 2023. 1. 14.
๋ฐ˜์‘ํ˜•

์„œ๋น„์Šค์—์„œ ํด๋ผ์ด์–ธํŠธ์˜ ๋ชจ๋“  ํ˜ธ์ถœ์— ๋Œ€ํ•ด ์ €์žฅํ•˜์—ฌ ๊ด€๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ด ๋•Œ, ๋‹จ์ˆœํžˆ ๋กœ๊ทธ๋กœ ๋‚จ๊ธธ์ˆ˜๋„ ์žˆ๊ณ  ํ˜น์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ชจ๋“  ์š”์ฒญ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜์—ฌ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ ์ •๋ณด(URI, Http Method, payload ๋“ฑ๋“ฑ)๋“ค์„ ๋กœ๊น… ๋ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๊ฐ„๋žตํžˆ ์‚ดํŽด๋ด…๋‹ˆ๋‹ค.

 

์˜ˆ์ œ ์ฝ”๋“œ๋Š” GitHub์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค :)

 

 

๐Ÿ”— ApiRequestEntity

 ApiRequestEntity  ํด๋ž˜์Šค๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•  ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ ๋ฐ์ดํ„ฐ์…‹์œผ๋กœ ๊ฐ ํ•„๋“œ์˜ ์—ญํ• ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  •  id : PK
  •  methodValue : Http Method
  •  apiUri : Request URI
  •  payload : Request Body
  •  requestIp : Client IP
  •  createdAt : ํ˜ธ์ถœ ์‹œ๊ฐ
  •  updateAt : ์ˆ˜์ • ์‹œ๊ฐ(=์ตœ์ดˆ ํ˜ธ์ถœ ์‹œ๊ฐ)

 

 

๐Ÿ”— LoggingAspect

LoggingAspect ํด๋ž˜์Šค๋Š” AOP๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฆฌํ€˜์ŠคํŠธ๊ฐ€ ์ปจํŠธ๋กค๋Ÿฌ ํ˜ธ์ถœ ์ „, ํ˜ธ์ถœ ํ›„, ์˜ˆ์™ธ ๋ฐ˜ํ™˜ ์‹œ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

(Spring AOP์— ๋Œ€ํ•œ ๋‚ด์šฉ์€ ํ•ด๋‹น ํฌ์ŠคํŒ…์„ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”)

 

  • loggingBefore() : ์ปจํŠธ๋กค๋Ÿฌ ํ˜ธ์ถœ ์ „ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ ์ •๋ณด๋ฅผ ๋กœ๊ทธ๋กœ ๋‚จ๊ธฐ๊ณ , LoggingEvent ๊ฐ์ฒด๋กœ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • loggingAfter() : ์ปจํŠธ๋กค๋Ÿฌ ํ˜ธ์ถœ ํ›„ ๋ฉ”์„œ๋“œ์˜ ์‘๋‹ต๊ฐ’์ด ์กด์žฌํ•  ๊ฒฝ์šฐ ๋กœ๊ทธ๋กœ ๋‚จ๊น๋‹ˆ๋‹ค.
  • loggingAfterThrowing() : ์ปจํŠธ๋กค๋Ÿฌ์˜ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์‹œ ๋กœ์ง์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ๋กœ๊ทธ๋กœ ๋‚จ๊น๋‹ˆ๋‹ค.

 

 

๐Ÿ”— LoggingEvent

LoggingEvent  ํด๋ž˜์Šค๋Š” ์ด๋ฒคํŠธ๋ฅผ ์ „๋‹ฌํ•  ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

ํ•ด๋‹น ํด๋ž˜์Šค๋Š” ApiRequestEntity ํด๋ž˜์Šค์—์„œ ํ•„์š”ํ•œ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ ์ •๋ณด์— ๋Œ€ํ•œ ๊ฐ’๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

๐Ÿ”— LoggingEventListener

LoggingEventListener  ํด๋ž˜์Šค๋Š” LoggingAspect ์—์„œ ๋ฐœํ–‰ํ•œ ์ด๋ฒคํŠธ๋ฅผ ๋ฆฌ์Šค๋„ˆ์—์„œ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

handleLoggingEvent() ๋ฉ”์„œ๋“œ๋Š” ์ปจํŠธ๋กค๋Ÿฌ ํ˜ธ์ถœ ์ „ ์š”์ฒญ ์ •๋ณด์— ๋Œ€ํ•ด์„œ๋งŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

 

ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹จ์ˆœํžˆ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๋Š” ๋กœ์ง์€ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋”ฐ๋กœ ์ด๋ฒคํŠธ๋กœ ๋ฐœํ–‰ํ•˜์—ฌ ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

 

 

๐Ÿ”— ApiRequestRepository

ํ”„๋กœ์ ํŠธ์—์„œ Spring Data JPA๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹จ์ˆœํžˆ JpaRepository ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›์€ ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค.

 

 

 

๐Ÿ”— UserController

ํ…Œ์ŠคํŠธ์—์„œ ์‚ฌ์šฉํ•  ๋งค์šฐ ๊ฐ„๋‹จํ•œ ์ปจํŠธ๋กค๋Ÿฌ์ž…๋‹ˆ๋‹ค.

Get, Post ๋ฉ”์„œ๋“œ๊ฐ€ ์กด์žฌํ•˜๊ณ  throwsGet() ๋ฉ”์„œ๋“œ๋Š” ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์‹œ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.

 

 

 

๐Ÿ”— API_REQUEST ํ…Œ์ด๋ธ”

CREATE TABLE `api_request` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `api_uri` varchar(100) DEFAULT NULL,
  `method_value` varchar(100) DEFAULT NULL,
  `payload` varchar(255) DEFAULT NULL,
  `request_ip` varchar(30) DEFAULT NULL,
  `created_at` datetime(6) DEFAULT NULL,
  `updated_at` datetime(6) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

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

 

 

 

ํ…Œ์ŠคํŠธ

Controller์˜ get๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด Request & Response ์ •๋ณด๊ฐ€ ๋กœ๊น…์— ๋‚จ๊ณ , Request ์ •๋ณด๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

 

Controller์˜ post๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด๋„ ๋™์ผํ•˜๊ฒŒ ์ •๋ณด๋“ค์ด ๋กœ๊น… ๋ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ์ด ๋ฉ๋‹ˆ๋‹ค.

 

Controller์˜ throwsGet ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๊ฒฝ์šฐ Request & Response ์ •๋ณด๊ฐ€ ๋กœ๊น…์— ๋‚จ๊ณ  ์ดํ›„ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Request ์ •๋ณด๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€