- file 전송을 위해서는 file 타입의 input 태그가 있어야 함
- form 태그의 method가 post여야 하며 multipart 인코딩 유형이어야 함
- multipartResolver는 tomcat의 설정파일인 web.xml에 multipart-config를 사용함
결과적으로 파일 업로드를 위한 설정은 servlet-context의 multipartResolver와 web.xml의 multipart-config를 필요로 함
- DI : 의존성 주입
- 싱글톤은 스프링이 관리함
- 컨트롤러도 스프링이 관리함
- 즉 객체가 하나인 것은 스프링이 관리함(여러개는 관리 못함)
- AOP : 예로 인터셉터가 있음
- 프록시클래스 설계를 실행 중에 자동으로 만들어주는 고급기술을 사용
- 파일첨부관련해서 링크 추가
- 이미지 타입이 아니라면 바로
- Controller가 요청을 받는 형태는 아님
- BoardController에 오타 있어서 수정
- setFilename으로 되어 있어서 파일의 이름이 O로 저장됨
- setFilename → setFiletype
- pom.xml에 AspectJ가 있지만 프록시클래스를 사용하기에는 추가로 aspectjweaver가 필요함
- 메이븐 저장소에서 aspectjweaver 검색
- pom.xml에 aspectj의 버전이 이미 있으므로 똑같이 맞출예정
- 아무 버전을 들어가서 코드 복사
- pom.xml에 붙여 넣은 후 version을 1.6.10으로 변경
- src/main/java에서 com.example에 aop 패키지 생성
- root-context.xml에 aop 패키지를 스캔하는 태그 추가함으로 애노테이션을 사용하면 스프링이 캐치할 수 있음
- aop를 사용하기 위해서 namespaces에서 aop를 체크해줌
- beans 목록에 aop가 추가됨
- 이제 aop로 시작하는 태그 사용가능
- aspectj 라이브러리를 이용해서 프록시 개체를 자동으로 만들 수 있게 태그 추가
- 메서드의 실행 시간을 알고싶으면 위와 같이 코드를 작성해야 함
- 각 메서드마다 알고 싶다면 모든 코드의 위의처럼 코드를 작성해야 하므로 불가능한 작업임
- 이걸 프록시가 가능하게 해결을 해줌
- 이런 구조로 만들면 Controller는 ProxyService를 Service로 인식함
- 이런 구조가 필요한 이유는 프록시를 사용할 수 있으며, 원본을 유지하기 쉬움
- 스프링이 자동으로 해주는 것임!
- com.example.aop 패키지에 LogAdvice 클래스 생성
- AOP 문법
- Component를 달아주고 추가적으로 Aspect 애노테이션을 달아줌
- 주변부 로직(횡단 관심사)
- Aspect랑 연동되는 애노테이션을 추가적으로 쓸 수 있으며, 설정했던 aspect-autoproxy가 적용됨- 자료형은 필수적으로 Object를 받음
- 다양한 자료형의 메서드를 받아야 하므로 Object로 선언하는 것임
- 매개변수는 필수적으로 ProceedingJoinPoint를 사용해야 함
- 전체주소 + 클래스명 + 메서드명 + 매개변수를 다 씀
- 모든 메서드를 가져오려면 *을 사용
- Point Cut이 되는 것임- Around는 타겟으로 지정할 대상의 앞뒤로 다 작용할 수 있는 강력한 주변부 로직임