✅ Spring AOP (Aspect-Oriented Programming) 는 공통 관심사를 분리하여 관리하는 프로그래밍 접근방법이다.(관점지향프로그래밍 지원 기술)
메소드 안의 기능을 핵심기능, 부가기능으로 나누었을 때, 부가기능을 공통된 하나의 장소에 모아서 관리하는 방식이 AOP 방식이다.
부가기능 : 보안, 로깅(사용자 접속내용 기록), [[트랜잭션]]관리(커밋, 롤백)
수평적 관점(횡단 관심사 cross-cutting concerns): 동등한 관점
예시 설명: 예를 들어, 프로그램에 로깅 기능이 필요한데 이를 모든 코드에 반복해서 작성하는 대신, AOP를 사용하여 로깅 기능을 한 곳에서 관리하고 다른 코드에 적용할 수 있습니다.
<->[[OOP]]가 객체를 중심으로 데이터와 기능을 구성한다면, AOP는 부가기능(advice)을 동적으로 추가해주는 기술이 필요하였다. (공통된 관심사)
java.util.regex.*
@Around("execution(* com.example.demo.*Logic.cud*(..))")
어떤 반환타입이든지/패키지명/Logic으로 끝나는 클래스/cud로 시작하는 메소드들/매개변수 상관없음
예 : cudEmp, cudBoard, cudNotice(o) / getBoardList, getNoticeList(x)
@Around("execution(* com.example.*.*(..))")
public class BoardLogc{
//아래 패턴에 일치하면 전에 con.setAutoCommit(false)
//후에 con.setAutoCommit(ture) 자동으로 붙여진다.
@Around("execution(* com.example.demo.*Logic.cud*(..))")
public String anyMethod(){
}
}
try{
methodA()
@AfterReturning // 예외 방생하지 않았을 때 부가기능에 붙임
} catch(){
@AfterThrowing //예외 발생했을 때 부가기능에 붙임
}
post 방식
- 바이너리파일 전송 시, Form-data로 선택하여 테스트 한 뒤 전송
- <form method="post" enctype = "multipart/form-data"> - 바이너리타입 제외 시, x-www-form-urlencoded -
목업 작업(Mock-up) or JUnit
Post & form-data
우리는 DB관리는 myBatis를 통해 하고 있었음. 파일추가 기능을 위해 DB 설정을 확인한 뒤 null에 대한 처리가 필요하다.
파일만 업로드 될 경우, 500번 에러가 발생할 수 있다.
myBatis는 동적 처리도 가능하니까 xml에 if문을 넣어서 맏늘 수 있음.
insert null 데이터 관련 처리 필요(mem_no, mem_id가 null 아님으로 설정되어있음.)
[[mybatis-3-user-guide_ko.pdf]]
<insert id="insertAuthor" parameterType="domain.blog.Author"> <selectKey keyProperty="id" resultType="int" order="BEFORE"> select CAST(RANDOM()*1000000 as INTEGER) a from SYSIBM.SYSDUMMY1 </selectKey> insert into Author (id, username, password, email,bio, favourite_section) values (#{id}, #{username}, #{password}, #{email}, #{bio}, #{favouriteSection,jdbcType=VARCHAR} ) </insert>
List<Map<String,Object>> boardDetail = new ArrayList<>();
Map<String,Object> dmap = new HashMap<>();
dmap.put("b_title","5개월 PT권 양도합니다.");
dmap.put("b_content","갑자기 지방발령으로 양도합니다. 원하시면 아래 이메일로 연락바랍니다.");
dmap.put("b_date","2024-01-03");
boardDetail.add(dmap);
List<Map<String,Object>> commentList = new ArrayList<>();
Map<String,Object> rmap = new HashMap<>();
rmap.put("bc_writer","키위");
rmap.put("bc_comment","혹시 몇회가 남은 건지 궁금합니다.");
commentList.add(rmap);
rmap = new HashMap<>();
rmap.put("bc_writer","사과");
rmap.put("bc_comment","혹시 5개월동안 헬스도 이용이 가능한 걸까요?.");
commentList.add(rmap);
rmap = new HashMap<>();
rmap.put("bc_writer","바나나");
rmap.put("bc_comment","혹시 사용기간이 제한되어 있는 걸까요?.");
commentList.add(rmap);
if(commentList.size()>0){
Map<String,Object> cmap = new HashMap<>();
cmap.put("comments", commentList);
boardDetail.add(1, cmap);
}
JPA 잘 사용하기 위해선 2단계까지의 마스터는 필요하다 JPA에서 테이블이 아닌 클래스 설계로 테이블 자동 생성됨 .
MyBatis와 다른 점, sql문이 보이지 않고, sql 튜닝 불가능 -> 대용량 DB 설계 어려움