객체지향 프로그래밍의 목적
객체 지향프로그래밍 특징
가 가능하다. 즉 이 세가지가 되지 않는다면 객체지향 플로그래밍 언어가 될 수 없다.
클래스란
1.객체를 만드는 틀이자
2.하위 클래스들의 공통점을 모아두는 곳이다.
일반적인 클래스라면 이래야 하지만,
클래스 조건 | abstract 클래스 | final 클래스 |
---|---|---|
객체를 만드는 특 역할을 한다. | X | O |
하위 클래스들의 공통점을 모아두는 곳 역할을 한다 | O | X |
확장된 것이 interface이다.
이때는 별로 상속관계가 도움은 안된다. 수직적으로 봤을 때 상속이라하면 맞지만, 수평적으로 봤을 때는 system이 중요할까? 로그인, 로그아웃, 장바구니 보기등이 중요할까?
당연히 후자고 로그인, 로그아웃, 장바구니 보기 등을 핵심로직,
Sysout은 부가로직이 된다.
핵심 로직은 중복되는 경우가 거의 없으며 부가로직은 중복되는 경우가 많다.
따라서 부가로직을 따로 떼놓고 이 부가로직의 핵심로직 전/후/전후에 알아서 필요한대로 끼워넣기를 한다. = Aspect Oriented Programming
즉, AOP, 관점지향프로그래밍라고 한다.
따라서 핵심인지 부가인지 판단하는것이 관점지향 프로그래밍의 핵심이다.
핵심로직에 부가로직을 전/후/전후에 요리조리 갖다 붙이는 작업을 위빙이라고 한다.
= 부가로직을 필요로하는 핵심로직의 전/후/전후에 엮는 것!aspect: 측면, 양식, 관점
자세히보면 catch 내부 로직은 내용이 거의 비슷하다!
그렇다면, 각 컨트롤러에서 하는게 아니라 스프링 내부의 라이프사이클과 관련된 클래스에 옮겨서 사용하면 더 간결한 코드가 되지않을까?
객체지향은 수직적이다 보니, 자식은 부모로부터 상속받는 부모영역까지 가진 큰 덩어리가 될 수 밖에 없는데, 부모 자식관계에서 벗어나서 관점지향적으로 핵심로직/부가로직을 따로 관리하게 되었다.
1.트랜잭션 시작
2.DML 작업
3.트랜잭션 종료(commit/rollback)
-> 각 포인트 컷에 트랜잭션이 시작/종료되는 로직이 있다 = 부가로직
선언적 트랜잭션 처리를 권장
@Transactional(rollbackFor = AddException.class)
특정익셉션이 발생햇을 때 rollback 처리를 해줄 수 있다.
주의!
Runtime Exception이 발생하면 자동 rollback 이 된다.
orderInfo이 null이라면 orderInfo.getLines()이 null = 자동 rollback
로그인 후, 장바구니에서 말도안되게 큰 값 넣은 후에
주문하기를 해보면 에러가 뜨고,