객체지향
- 객체지향 프로그래밍 목적 -> 재사용성 높이자!
- 객체지향 프로그래밍 특징
- 상속
- 다형성
- 캡슐화
- 중복되는 코드들을 부모클래스로 만드는 것 -> 상속
클래스란? 객체를 만드는 틀 or 하위클래스의 공통점을 모아두는 곳 (둘 역할 다 할수도있음)
- 추상클래스 : 하위클래스의 공통점을 모아두는 곳 (new 생성자 이용불가)
- final클래스 : 객체를 만드는 틀의 역할 (하위클래스 가질 수 없음)
AOP
- 분명히 중복되는 코드가 있음에도 불구하고 상속받기엔 애매하다.
- 상속: 수직적인 부모에 공통관계를 밀어넣는 것
-> 공통적인 부분을 상속처럼 수직적으로 처리하지않고 수평적으로 관리하고 싶다.- 더 중요한 작업 : 핵심 로직 (로그인, 로그아웃 ,장바구니) / sout은 덜중요함: 부가 로직
- 핵심로직의 전 또는 후 또는 전후 에 부가로직을 알아서 끼워넣기 하는 것 -> 관점지향프로그래밍 (Aspect Oriented Programming)
- 끼워넣는 것, 엮는 것 : weaving(엮다), 부가로직을 필요로 하는 핵심로직에 엮는 것.
- 부가로직을 제대로 만들어 넣고 끼워 넣는 것. 핵심로직을 묶어 놓은 것(부가로직이 들어갈 수 있는 부분) =
포인트 컷
이라 함.- 객체지향 프로그램의 단점 : 공통적인 부분은 부모에 몰아넣고 상속받아 사용하기 때문에 부모-자식을 따로 관리할 수 없는데, 관점지향 프로그래밍은 핵심로직 따로 부가로직 따로 별개로 관리하다가 필요할때만 위빙하는 것
- AOP : controller의 예외처리, transaction 처리할때 많이 쓰임
AOP 만드는 법
- 포인트컷에 부가로직을 어떻게 위빙할 것이다.(방법) = advice
- controller에서 throws한 예외는 스프링 컨테이너가 받음. -> ExceptionHandler이 선언돼있는 메서드를 자동 호출해줄 것.
- 위에 try -catch는 없애고 throws FindException으로 던져주고, throws가 발생하면
@ExceptionHandler(FindException.class)
가 실행됨- FindException 을 공통모듈이 아닌 패키지마다 각각 설정하고 싶다면, 각 해당 도메인 control안에 FindException을 만들고 위치도 확실하게 설정해주면 된다.
- Exception 여러개 만들려면 위와 같이 만들면 되고, 각 throws들은 메서드 마다 맞춰서 던져주면 알아서 받아올 것임.
- 부가로직이 고객가입 메서드에서도, 주문추가 메서드에서도 위빙돼서 공통되어 사용.
-> 상속이 아닌 수평관계로 엮어주는 것이다~
또다른 AOP.. 트랜잭션
- 트랜잭션 시작 (자동) -> 부가로직
- DML 작업
(핵심로직)
(ex, 주문추가, 수정, 삭제)- 트랜잭션 종료 (commit & rollback) -> 부가로직
-> 부가로직을 핵심기능마다 전 & 후에 처리해줘야한다.
-> 스프링에서 선언적 트랜잭셔널 처리하는 것을 권장한다.
-> 소스코드에 직접 commit, rollback 쓰지 마라. (개발자는 핵심로직에만 집중하고 싶은데 이건 부담임)
->@Transactional
(rollbackFor = AddException.class)
-> 이 메서드를 호출하다가 addException이 발생하면 무조건 롤백하라는 뜻.
-> 놓치지 말아야 할 게 있음. 자동 롤백되는 경우가 있음!! -> 트랜잭셔널용 메서드의 내부에서Runtime Exception
이 발생하면 자동롤백이 된다. 주의!
- 트랜잭셔널 이용하기 위해서 아래코드를 위와 같이 myApplicationContext.xml에 추가
xmlns:tx="http://www.springframework.org/schema/tx" http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
- 아래 코드는 beans 안에 추가
<tx:annotation-driven transaction-manager="transactionManager" /> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSourceHikari" /> </bean>
↳ 장바구니에 추가되다가 말 것임 (롤백)