์๋น์ค์์ ํด๋ผ์ด์ธํธ์ ๋ชจ๋ ํธ์ถ์ ๋ํด ์ ์ฅํ์ฌ ๊ด๋ฆฌ๋ฅผ ํ ์ ์์ต๋๋ค.
์ด ๋, ๋จ์ํ ๋ก๊ทธ๋ก ๋จ๊ธธ์๋ ์๊ณ ํน์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ชจ๋ ์์ฒญ ์ ๋ณด๋ฅผ ์ ์ฅํ์ฌ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
์ด๋ฒ ํฌ์คํ ์์๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ ์ ๋ณด(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 ์ ๋ณด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
'Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Spring DispatcherServlet(๋์คํจ์ฒ์๋ธ๋ฆฟ) ๊ฐ๋ ๋ถํฐ ๋์ ๊ณผ์ ๊น์ง (4) | 2023.02.11 |
---|---|
SpringBoot Multi DataSource - JPA (0) | 2023.01.21 |
Spring + MyBatis์์ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ์ ๊ฐ์ฒด๊ฐ ๋งคํ์ด ๋๋ ๊ณผ์ (1) | 2022.10.03 |
JUnit5 assertThat vs assertAll vs assertSoftly (3) | 2022.09.17 |
Spring Boot profiles ์ค์ ํ๊ธฐ (1) | 2022.09.05 |
๋๊ธ