일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 웹동아리
- 멋쟁이사자처럼11기
- 백엔드
- 멋사 10기
- 멋사 면접
- discord
- 멋쟁이사자처럼대학
- 멋쟁이사자처럼 서류
- 멋사12
- API
- 멋사 서류
- 멋사11기
- 멋쟁이사자처럼
- 멋쟁이 사자처럼
- 멋사
- 멋쟁이사자처럼10기
- 파이썬 크롤링
- 깃허브
- ㅏㄴ
- 멋사10기
- 기사 제목 크롤링
- 크롤링
- 파이썬
- django
- 알림봇
- 코딩동아리
- 디스코드봇
- 멋사 합격
- 멋사 서류평가
- IT동아리
- Today
- Total
ACHO.pk devlog
[Springboot] AOP 적용 본문
인프런 김영한 강사님의 "스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술"의 강의를 듣고 학습하였습니다.
1. AOP가 필요한 상황
• 모든 메소드의 호출 시간을 측정하고 싶다면?
• 공통 관심 사항(cross-cutting concern) vs 핵심 관심 사항(core concern)
• 회원 가입 시간, 회원 조회 시간을 측정하고 싶다면?
[MemberService 회원 조회 시간 측정 추가]
MemberService 파일 수정
package Springboot.study.service;
import Springboot.study.domain.Member;
import Springboot.study.repository.MemberRepository;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Optional;
@Transactional
public class MemberService {
private final MemberRepository memberRepository;
public MemberService(MemberRepository memberRepository){
this.memberRepository = memberRepository;
}
/**
* 회원가입
*/
public Long join(Member member) {
long start = System.currentTimeMillis();
try {
validateDuplicateMember(member); //중복 회원 검증
memberRepository.save(member);
return member.getId();
} finally {
long finish = System.currentTimeMillis();
long timeMs = finish - start;
System.out.println("join " + timeMs + "ms");
}
}
/**
* 전체 회원 조회
*/
public List<Member> findMembers() {
long start = System.currentTimeMillis();
try {
return memberRepository.findAll();
} finally {
long finish = System.currentTimeMillis();
long timeMs = finish - start;
System.out.println("findMembers " + timeMs + "ms");
}
}
}
이와 같이 코드를 작성하게 되면 문제가 생긴다.
회원가입, 회원 조회에 시간을 측정하는 기능은 핵심 관심 사항이 아니고,
시간을 측정하는 로직은 공통 관심 사항이고,
시간을 측정하는 로직과 핵심 비즈니스의 로직이 섞여서 유지보수가 어렵고,
시간을 측정하는 로직을 별도의 공통 로직으로 만들기 매우 어렵고,
시간을 측정하는 로직을 변경할 때 모든 로직을 찾아가면서 변경해야 한다.
이러한 문제를 해결하기 위해 AOP를 적용한다.
2. AOP 적용
AOP: Aspect Oriented Programming
공통 관심 사항(cross-cutting concern) vs 핵심 관심 사항(core concern) 분리
[시간 측정 AOP 등록]
▹src/main/java/Springboot.study/aop/ 패키지 하위에 TimeTraceAop 클래스를 생성한다.
package Springboot.study.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
@Component
@Aspect
public class TimeTraceAop {
@Around("execution(* Springboot.study..*(..))")
public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {
long start = System.currentTimeMillis();
System.out.println("START: " + joinPoint.toString());
try {
return joinPoint.proceed();
} finally {
long finish = System.currentTimeMillis();
long timeMs = finish - start;
System.out.println("END: " + joinPoint.toString() + " " + timeMs +
"ms");
}
}
}
@Component 어노테이션으로 TimeTraceAop를 스프링 빈으로 등록해준다.
@Aspect 어노테이션을 입력하여 해당 클래스가 AOP임을 알려준다.
@Around("execution(* Springboot.study..*(..))")
이 부분은 AOP가 적용될 범위이다. execution은 패키지명, 클래스명, 파라미터 타입 등을 받는다.
이와 같이 코드를 작성하면 앞선 문제를 해결할 수 있다.
회원가입, 회원 조회등 핵심 관심사항과 시간을 측정하는 공통 관심 사항을 분리하고,
시간을 측정하는 로직을 별도의 공통 로직으로 만들고,
핵심 관심 사항을 깔끔하게 유지할 수 있고,
변경이 필요하면 이 로직만 변경하면 되고,
원하는 적용 대상을 선택할 수 있다.
끝으로.. 2학년 때 자바를 교수님께 배우면서.. 또 따로 학습하면서... 스프링부트를 다시 해봐야겠습니다.
솔직히 강의 들으면서 이게 뭐야! 하는게 너무 많았고, 아무래도 언어의 기본이 잡혀있지 않다보니. 쉽지 않네요..^^
개발자가 된다는 건 정말 어렵고 험난한 길입니다.~ 그럼에도 이 길을 선택했으니 제가 견뎌야 마땅한 것이겠지요~
스프링부트를 요거트로 친다면.. 전 그냥 요거트 통 겉면을 유심히 관찰했다. 고 말할 수 있겠네요.
다음엔 비닐에 묻은 요거트까지 핥아 먹을 수 있는 스프링 부트 학습이 되길 간절히.. 바랍니다.
'프레임워크 > Springboot' 카테고리의 다른 글
[Springboot-쇼핑몰프로젝트] Thymeleaf 학습하기 (0) | 2023.02.17 |
---|---|
[Springboot-쇼핑몰프로젝트] 환경 구축과 Mysql 연동 (0) | 2023.02.04 |
[Springboot] 스프링데이터 JPA (0) | 2023.01.26 |
[Springboot] JPA (0) | 2023.01.25 |
[Springboot] 스프링 JdbcTemplate (0) | 2023.01.25 |