์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
- ์๋ฐ
- spring scheduler
- docker
- Personal Access Token
- java์ฑํ
- ์๊ณ ๋ฆฌ์ฆ
- Jenkins
- GoogleLogin
- Node.js
- MySQL
- db์ํคํ ์ณ
- db์ ๋ต
- ๋ ผ๋ธ๋กํน
- ์ฝ๋ฉํ ์คํธ
- ์ฝํ
- ๋์์ธํจํด
- CICD
- ํฌ๋ก์ค์ฌ์ดํธ ์คํฌ๋ฆฝํธ
- dockerhub
- Java
- ํฐ์คํ ๋ฆฌ์ฑ๋ฆฐ์ง
- ์ค๋ธ์
- spring
- @scheduler
- ์ฟ ๋ฒ๋คํฐ์ค
- React
- injection๊ณต๊ฒฉ
- SpringBoot
- node.js mysql ์ฐ๋
- oauth
- Today
- Total
<Hello Hosung๐/>
[Spring] AOP ๊ฐ๋ ๋ถํฐ ๋ก๊น ์์ ๊น์ง ํ ๋ฒ์ ์ดํดํ๊ธฐ ๋ณธ๋ฌธ
[Spring] AOP ๊ฐ๋ ๋ถํฐ ๋ก๊น ์์ ๊น์ง ํ ๋ฒ์ ์ดํดํ๊ธฐ
์ข์ถฉ์ฐ๋ ๋ฐฑ์๋ ๊ฐ๋ฐ์ ์ผ๊ธฐ๐ง 2024. 11. 17. 21:28
Spring AOP๋ ๋ฌด์์ธ๊ฐ์?
Spring AOP(Aspect-Oriented Programming)๋ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ํ๊ณ๋ฅผ ๋ณด์ํ๊ธฐ ์ํด ๋์
๋ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ฒ์
๋๋ค. AOP๋ '๊ด์ ์งํฅ ํ๋ก๊ทธ๋๋ฐ'์ผ๋ก, ํ๋ก๊ทธ๋จ์ ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง ์ธ์ ๊ณตํต์ ์ธ ๊ธฐ๋ฅ(์: ๋ก๊น
, ํธ๋์ญ์
๊ด๋ฆฌ ๋ฑ)์ ๋
๋ฆฝ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๊ฒ ํด์ค๋๋ค. ์ด๋ฅผ ํตํด ์ฝ๋ ์ค๋ณต์ ์ค์ด๊ณ , ์ ์ง๋ณด์๋ฅผ ์ฉ์ดํ๊ฒ ํฉ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก AOP๋ ํต์ฌ ๊ธฐ๋ฅ๊ณผ๋ ๋ณ๋๋ก "๊ด์ (Aspect)"์ด๋ผ๋ ๊ฐ๋
์ ์ฌ์ฉํ์ฌ ๊ณตํต๋ ๊ด์ฌ์ฌ๋ฅผ ๋ชจ๋ํํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ก๊ทธ๋ฅผ ๋จ๊ธฐ๋ ๊ธฐ๋ฅ์ด๋ ํธ๋์ญ์
๊ด๋ฆฌ๋ฅผ AOP๋ฅผ ํตํด ๋ณ๋๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
AOP์ ํต์ฌ ๊ฐ๋
Aspect (๊ด์ ): ํต์ฌ ๋ก์ง์ ๋ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ๋ชจ๋์
๋๋ค. ์๋ฅผ ๋ค์ด, ๋ก๊น
์ด๋ ํธ๋์ญ์
์ฒ๋ฆฌ๊ฐ ์ฌ๊ธฐ์ ํด๋น๋ฉ๋๋ค.
Joinpoint (์กฐ์ธ ํฌ์ธํธ): AOP๊ฐ ์ ์ฉ๋ ์ ์๋ ์ง์ ์
๋๋ค. ์ฃผ๋ก ๋ฉ์๋ ์คํ ์ , ํ, ์์ธ ๋ฐ์ ์ ๋ฑ์ด ํด๋น๋ฉ๋๋ค.
Advice (์ด๋๋ฐ์ด์ค): ์ค์ ๋ก ์คํ๋๋ ๋ถ๊ฐ์ ์ธ ์์
์
๋๋ค. ๋ฉ์๋ ์คํ ์ ํ์ ๋ก๊น
์ ํ๋ค๋ ์ง, ์์ธ ๋ฐ์ ์ ์ฒ๋ฆฌ๋ฅผ ํ๋ค๋ ์ง ํ๋ ์์
์ ๋งํฉ๋๋ค.
Pointcut (ํฌ์ธํธ์ปท): Advice๊ฐ ์ธ์ ์ ์ฉ๋ ์ง ์ ์ํ๋ ํํ์์
๋๋ค. ์๋ฅผ ๋ค์ด, ํน์ ํจํค์ง๋ ํด๋์ค ๋ด์ ๋ฉ์๋์๋ง AOP๋ฅผ ์ ์ฉํ ์ ์์ต๋๋ค.
Weaving (์๋น): AOP๊ฐ ์ค์ ๋ก ์ ์ฉ๋์ด ์ฝ๋์ ๊ฒฐํฉ๋๋ ๊ณผ์ ์
๋๋ค. Spring์์๋ ๋ฐํ์์ ์๋น์ด ์ผ์ด๋ฉ๋๋ค.
AOP๊ฐ ์ฌ์ฉ๋๋ ์ฃผ์ ์์
๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ AOP์ ์์ ์ค ํ๋๋ **๋ก๊น
(logging)**์
๋๋ค. ๋ฉ์๋๊ฐ ํธ์ถ๋ ๋๋ง๋ค ๋ก๊ทธ๋ฅผ ์ฐ๊ณ ์ถ๋ค๋ฉด, AOP๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น ๊ธฐ๋ฅ์ ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๋ถ๋ฆฌํ ์ ์์ต๋๋ค.
Spring AOP๋ฅผ ์ด์ฉํ ๋ก๊น ์์
์ด์ Spring AOP๋ฅผ ์ด์ฉํ ๊ฐ๋จํ ๋ก๊น
์์ ๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค. ์ด ์์ ์์๋ ๋ฉ์๋ ์คํ ์ ํ์ ๋ก๊น
์ ํ๋ ๊ฐ๋จํ AOP๋ฅผ ๊ตฌํํฉ๋๋ค.
1. Spring Boot ํ๋ก์ ํธ ์ค์
๋จผ์ Spring Boot ํ๋ก์ ํธ์ AOP ์์กด์ฑ์ ์ถ๊ฐํฉ๋๋ค. build.gradle ๋๋ pom.xml์ AOP ๊ด๋ จ ์์กด์ฑ์ ์ถ๊ฐํ์ธ์.
<!-- pom.xml์ AOP ์์กด์ฑ ์ถ๊ฐ -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2. Service ํด๋์ค ์์ฑ
์ค์ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ Service ํด๋์ค๋ฅผ ์์ฑํฉ๋๋ค.
@Service
public class UserService {
public void createUser(String name) {
System.out.println("์ฌ์ฉ์ " + name + " ์์ฑ");
}
}
3. AOP ํด๋์ค ์์ฑ (๋ก๊น
๊ธฐ๋ฅ)
๋ก๊น
์ ์ํ Aspect ํด๋์ค๋ฅผ ์์ฑํฉ๋๋ค. ์ด ํด๋์ค์์ @Before, @After, @Around ๋ฑ์ ์ด๋
ธํ
์ด์
์ ์ฌ์ฉํ์ฌ ๋ฉ์๋ ์คํ ์ ํ์ ๋ก๊น
์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
@Aspect
@Component
public class LoggingAspect {
// ๋ฉ์๋ ์คํ ์
@Before("execution(* com.example.service.UserService.createUser(..))")
public void logBefore(JoinPoint joinPoint) {
System.out.println("๋ฉ์๋ ์คํ ์ : " + joinPoint.getSignature().getName());
}
// ๋ฉ์๋ ์คํ ํ
@After("execution(* com.example.service.UserService.createUser(..))")
public void logAfter(JoinPoint joinPoint) {
System.out.println("๋ฉ์๋ ์คํ ํ: " + joinPoint.getSignature().getName());
}
}
4. AOP ์ ์ฉ ํ์ธ
UserService์ createUser ๋ฉ์๋๊ฐ ํธ์ถ๋ ๋๋ง๋ค LoggingAspect๊ฐ ์ ์ฉ๋์ด ๋ก๊น
์ด ์ถ๋ ฅ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
@SpringBootApplication
public class AopExampleApplication {
public static void main(String[] args) {
ApplicationContext context = SpringApplication.run(AopExampleApplication.class, args);
UserService userService = context.getBean(UserService.class);
userService.createUser("John Doe");
}
}
์ด ์ฝ๋๋ฅผ ์คํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ก๊ทธ๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค.
๋ฉ์๋ ์คํ ์ : createUser
์ฌ์ฉ์ John Doe ์์ฑ
๋ฉ์๋ ์คํ ํ: createUser
AOP์ ์ฅ์
์ฝ๋ ์ค๋ณต ์ ๊ฑฐ: ๋ก๊น
์ด๋ ํธ๋์ญ์
๊ด๋ฆฌ ๊ฐ์ ๊ณตํต ๊ธฐ๋ฅ์ AOP๋ฅผ ํตํด ํ ๊ณณ์์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
๋ชจ๋ํ: ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๋ถ๊ฐ ๊ธฐ๋ฅ์ ๋ถ๋ฆฌํ์ฌ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
์ ์ฐ์ฑ: ํฌ์ธํธ์ปท์ ํตํด ์ด๋์ AOP๋ฅผ ์ ์ฉํ ์ง ์ฝ๊ฒ ์กฐ์ ํ ์ ์์ต๋๋ค.
AOP์ ๋จ์
๋๋ฒ๊น
์ด๋ ค์: AOP๋ ์คํ ์์ ์์ ๋์ํ๋ฏ๋ก ๋๋ฒ๊น
์ด ์ด๋ ค์ธ ์ ์์ต๋๋ค.
์ฑ๋ฅ ์ด์: AOP๋ฅผ ๊ณผ๋ํ๊ฒ ์ฌ์ฉํ๋ฉด ์ฑ๋ฅ์ ๋ถ์ ์ ์ธ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค.
๋ง๋ฌด๋ฆฌ
Spring AOP๋ ๊ณตํต ๊ด์ฌ์ฌ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ๋งค์ฐ ์ ์ฉํ ๋๊ตฌ์ ๋๋ค. ๋ก๊น , ๋ณด์, ํธ๋์ญ์ ๊ด๋ฆฌ ๋ฑ ์ฌ๋ฌ ๊ณณ์์ ํ์ฉ๋ ์ ์์ผ๋ฉฐ, ์ฝ๋์ ์ ์ง๋ณด์์ฑ์ ๋์ด๋ ๋ฐ ํฐ ๋์์ด ๋ฉ๋๋ค. AOP๋ฅผ ์ ํ์ฉํ๋ฉด ๋น์ฆ๋์ค ๋ก์ง์ ์ํฅ์ ์ฃผ์ง ์์ผ๋ฉด์๋ ํจ์จ์ ์ธ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
'๐ป Java > ใ คJava(SpringBoot)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SpringBoot] Spring Security๋ฅผ ํ์ฉํ ์ธ์ฆ ๋ฐ ๊ถํ (1) | 2024.11.23 |
---|---|
[SpringBoot] ์์กด์ฑ ์ฃผ์ (Dependency Injection) ๊ฐ๋ ๊ณผ ํ์ฉ (5) | 2024.11.08 |
[SpringBoot]Scheduling (0) | 2024.08.16 |