1. AOP

1-1. AOPλž€?

<aside> πŸ’‘ AOPλŠ” 관점 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°(Aspect Oriented Programming)의 μ•½μžμ΄λ‹€. μ€‘λ³΅λ˜λŠ” 곡톡 μ½”λ“œλ₯Ό λΆ„λ¦¬ν•˜κ³  μ½”λ“œ μ‹€ν–‰ μ „μ΄λ‚˜ ν›„μ˜ μ‹œμ μ— ν•΄λ‹Ή μ½”λ“œλ₯Ό μ‚½μž…ν•¨μœΌλ‘œμ¨ μ†ŒμŠ€ μ½”λ“œμ˜ 쀑볡을 쀄이고, ν•„μš”ν•  λ•Œλ§ˆλ‹€ κ°€μ Έλ‹€ μ“Έ 수 있게 κ°μ²΄ν™”ν•˜λŠ” κΈ°μˆ μ„ λ§ν•œλ‹€.

</aside>

ν™”λ©΄ 캑처 2023-06-11 194027.png

1-2. AOP 핡심 μš©μ–΄

μš©μ–΄ μ„€λͺ…
Aspect 핡심 λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§κ³ΌλŠ” λ³„λ„λ‘œ μˆ˜ν–‰λ˜λŠ” νš‘λ‹¨ 관심사λ₯Ό λ§ν•œλ‹€.
Advice Aspect의 κΈ°λŠ₯ 자체λ₯Ό λ§ν•œλ‹€.
Join point Adviceκ°€ 적용될 수 μžˆλŠ” μœ„μΉ˜λ₯Ό λ§ν•œλ‹€.
Pointcut Join point μ€‘μ—μ„œ Adviceκ°€ 적용될 κ°€λŠ₯성이 μžˆλŠ” 뢀뢄을 μ„ λ³„ν•œ 것을 λ§ν•œλ‹€.
Weaving Adviceλ₯Ό 핡심 λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ— μ μš©ν•˜λŠ” 것을 λ§ν•œλ‹€.

ν™”λ©΄ 캑처 2023-06-11 194408.png

1-3. Advice의 μ’…λ₯˜

μ’…λ₯˜ μ„€λͺ…
Before λŒ€μƒ λ©”μ†Œλ“œκ°€ μ‹€ν–‰λ˜κΈ° 이전에 μ‹€ν–‰λ˜λŠ” μ–΄λ“œλ°”μ΄μŠ€
After-returning λŒ€μƒ λ©”μ†Œλ“œκ°€ μ •μƒμ μœΌλ‘œ μ‹€ν–‰λœ 이후에 μ‹€ν–‰λ˜λŠ” μ–΄λ“œλ°”μ΄μŠ€
After-throwing μ˜ˆμ™Έκ°€ λ°œμƒν–ˆμ„ λ•Œ μ‹€ν–‰λ˜λŠ” μ–΄λ“œλ°”μ΄μŠ€
After λŒ€μƒ λ©”μ†Œλ“œκ°€ μ‹€ν–‰λœ 이후에(정상, μ˜ˆμ™Έ 관계없이) μ‹€ν–‰λ˜λŠ” μ–΄λ“œλ°”μ΄μŠ€
Around λŒ€μƒ λ©”μ†Œλ“œ μ‹€ν–‰ μ „/후에 μ μš©λ˜λŠ” μ–΄λ“œλ°”μ΄μŠ€

1-4. Spring AOP

μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬μ—μ„œ μ œκ³΅ν•˜λŠ” AOPλŠ” λ‹€μŒκ³Ό 같은 νŠΉμ§•μ„ κ°€μ§„λ‹€.

ν™”λ©΄ 캑처 2023-06-11 194916.png

2. Spring AOP κ΅¬ν˜„ν•˜κΈ°

2-1. λ‘œμ§μ„ ν¬ν•¨ν•˜λŠ” μ½”λ“œ μž‘μ„±

  1. MemberDTO 클래슀 생성

    @AllArgsConstructor
    @ToString
    public class MemberDTO {
    
        private Long id;
        private String name;
    }
    
  2. MemberDAO 클래슀 생성

    @Repository
    public class MemberDAO {
    
        private final Map<Long, MemberDTO> memberMap;
    
        public MemberDAO(){
            memberMap = new HashMap<>();
            memberMap.put(1L, new MemberDTO(1L, "μœ κ΄€μˆœ"));
            memberMap.put(2L, new MemberDTO(2L, "홍길동"));
        }
    
        public Map<Long, MemberDTO> selectMembers(){
    
            return memberMap;
        };
    
        public MemberDTO selectMember(Long id) {
    
            MemberDTO returnMember = memberMap.get(id);
    
            if(returnMember == null) throw new RuntimeException("ν•΄λ‹Ήν•˜λŠ” id의 νšŒμ›μ΄ μ—†μŠ΅λ‹ˆλ‹€.");
    
            return returnMember;
        }
    }
    
  3. MemberService 클래슀 생성

    @Service
    public class MemberService {
    
        private final MemberDAO memberDAO;
    
        public MemberService(MemberDAO memberDAO) {
            this.memberDAO = memberDAO;
        }
    
    		public Map<Long, MemberDTO> selectMembers(){
            System.out.println("selectMembers λ©”μ†Œλ“œ μ‹€ν–‰");
            return memberDAO.selectMembers();
        }
    
        public MemberDTO selectMember(Long id) {
            System.out.println("selectMember λ©”μ†Œλ“œ μ‹€ν–‰");
            return memberDAO.selectMember(id);
        }
    }
    
  4. Application 클래슀 생성

    public class Application {
        public static void main(String[] args) {
    
            ApplicationContext context 
    					= new AnnotationConfigApplicationContext("com.ohgiraffers.section01.aop");
    
            MemberService memberService = context.getBean("memberService", MemberService.class);
            System.out.println("=============== selectMembers ===============");
            System.out.println(memberService.selectMembers());
            System.out.println("=============== selectMember ===============");
            System.out.println(memberService.selectMember(3L));
    
        }
    }