<aside> π‘ AOPλ κ΄μ μ§ν₯ νλ‘κ·Έλλ°(Aspect Oriented Programming)μ μ½μμ΄λ€. μ€λ³΅λλ κ³΅ν΅ μ½λλ₯Ό λΆλ¦¬νκ³ μ½λ μ€ν μ μ΄λ νμ μμ μ ν΄λΉ μ½λλ₯Ό μ½μ ν¨μΌλ‘μ¨ μμ€ μ½λμ μ€λ³΅μ μ€μ΄κ³ , νμν λλ§λ€ κ°μ Έλ€ μΈ μ μκ² κ°μ²΄ννλ κΈ°μ μ λ§νλ€.
</aside>

| μ©μ΄ | μ€λͺ |
|---|---|
| Aspect | ν΅μ¬ λΉμ¦λμ€ λ‘μ§κ³Όλ λ³λλ‘ μνλλ ν‘λ¨ κ΄μ¬μ¬λ₯Ό λ§νλ€. |
| Advice | Aspectμ κΈ°λ₯ μ체λ₯Ό λ§νλ€. |
| Join point | Adviceκ° μ μ©λ μ μλ μμΉλ₯Ό λ§νλ€. |
| Pointcut | Join point μ€μμ Adviceκ° μ μ©λ κ°λ₯μ±μ΄ μλ λΆλΆμ μ λ³ν κ²μ λ§νλ€. |
| Weaving | Adviceλ₯Ό ν΅μ¬ λΉμ¦λμ€ λ‘μ§μ μ μ©νλ κ²μ λ§νλ€. |

| μ’ λ₯ | μ€λͺ |
|---|---|
| Before | λμ λ©μλκ° μ€νλκΈ° μ΄μ μ μ€νλλ μ΄λλ°μ΄μ€ |
| After-returning | λμ λ©μλκ° μ μμ μΌλ‘ μ€νλ μ΄νμ μ€νλλ μ΄λλ°μ΄μ€ |
| After-throwing | μμΈκ° λ°μνμ λ μ€νλλ μ΄λλ°μ΄μ€ |
| After | λμ λ©μλκ° μ€νλ μ΄νμ(μ μ, μμΈ κ΄κ³μμ΄) μ€νλλ μ΄λλ°μ΄μ€ |
| Around | λμ λ©μλ μ€ν μ /νμ μ μ©λλ μ΄λλ°μ΄μ€ |
μ€νλ§ νλ μμν¬μμ μ 곡νλ AOPλ λ€μκ³Ό κ°μ νΉμ§μ κ°μ§λ€.

MemberDTO ν΄λμ€ μμ±
@AllArgsConstructor
@ToString
public class MemberDTO {
private Long id;
private String name;
}
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;
}
}
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);
}
}
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));
}
}