`스프링 핵심 원리 - 기본편` 강의를 듣고 정리한 자료입니다
✨ 객체 지향
특징
1. 추상화
2. 캡슐화
3. 상속
4. 다형성
- 컴포넌트를 쉽고 유연하게 변경하면서 개발할 수 있다
- 스프링은 객체 지향의 특징인 `다형성`을 살리는 좋은 객체 지향 개발 프레임워크이다
✨ 다형성
개념
- 하나의 객체가 여러 가지 타입을 가질 수 있는 것
-> 자바에서는 이러한 다형성을 부모 클래스 타입의 참조 변수로 자식 클래스 탑의 인스턴스를 참조할 수 있도록 하여 구현하였다
- 역할 (인터페이스) 와 구현 (인터페이스 구현 클래스, 구현 객체) 으로 구분
- 쉽게 말하면 갈아끼우는 것이라 생각하면 된다
- 자바에서는 `오버라이딩`으로 다형성을 구현하였다
- 다형성으로 인터페이스를 구현한 객체를 실행 시점에 유연하게 변경이 가능하다
객체 vs 인스턴스
- 인스턴스 : 클래스의 정의를 통해 만들어진 객체
- 거의 동일한 개념으로 사용
- 클래스를 인스턴스화해서 객체 생성
✨ SOLID
SRP
- 단일 책임 원칙
- 한 클래스는 하나의 기능을 담당
- 변경에 흔들리지 않아야 한다
OCP
- 개방-폐쇄 원칙
- "확장에는 열려 있으나 변경에는 닫혀 있어야 한다"
- 다형성 활용
LSP
- 리스코프 치환 원칙
- 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다
-> ex) 자동차 인터페이스의 엑셀은 앞으로 가라는 기능을 지켜야 한다
ISP
- 인터페이스 분리 원칙
- `범용` 보다는 `특정`이 낫다
- 목적은 명확한 인터페이스 (대체 가능성이 높아진다)
DIP
- 의존관계 역전 원칙
- 추상화에 의존해야지, 구체화에 의존해서는 안 된다
- 역할에 의존하게 해야 함 (구현체에 의존하면 변경이 어려워진다)
- `의존성 주입` 또한 이 원칙을 따른다
✨ 영속성 컨텍스트
- 엔티티를 영구 저장하는 환경
- 애플리케이션과 DB 사이에서 객체를 보관하는 가상의 데이터베이스 같은 역할을 함
- 엔티티 매니저를 통해 엔티티 저장 or 조회 시 엔티티 매니저가 영속성 컨텍스트에 엔티티를 보관하고 관리한다
✨ 트랜잭션
개념
- 데이터베이스의 상태를 변화시키기 위해 수행하는 작업의 단위
- 데이터의 상태를 변화시킨다는 것은 SQL을 이용해 DB에 접근하는 것을 의미한다
- 작업의 단위는 질의어 한 문장이 아니라는 점을 유의해야 한다
ex) 게시글 작성 -> 버튼 클릭 -> 업데이트된 게시판 보기
-> Insert (버튼 클릭 시 게시글의 데이터 전송) -> Select (최신 정보 유지)
-> 작업의 단위 : Insert + Select (하나의 트랜잭션)
성질 (ACID)
- Atomicity (원자성)
-> 트랜잭션의 연산은 DB에 모두 반영되든지 혹은 전혀 반영되지 않아야 한다
-> 어느 하나라도 오류 발생 시 트랜잭션 전부가 취소되어야 한다
- Consistency (일관성)
- Isolation (독립성)
-> 둘 이상의 트랜잭션이 동시에 병행 실행되는 경우 어느 하나의 트랜잭션 실행 중 다른 트랜잭션의 연산이 끼어들 수 없다
- Durability (영속성)
용어
- Commit
-> 하나의 트랜잭션이 성공적으로 끝났고, 데이터베이스가 일관성 있는 상태에 있을 때, 하나의 트랜잭션이 끝났다는 것을 알려주기 위해 사용하는 연산
- Rollback
-> 하나의 트랜잭션 처리가 비정상적으로 종료되어 트랜잭션의 원자성이 깨진 경우, 트랜잭션을 처음부터 다시 시작하거나 트랜잭션의 부분적으로만 연산된 결과를 다시 취소시킨다
-> spring에서의 `@Rollback`은 test 시 사용
✨ 애노테이션
- `@Component` : 애노테이션이 있으면 스프링 빈으로 자동 등록
- `@Controller`
- `@Service`
- `@Repository`
- `@Autowired` : DI
- `@Id` : 기본키 생성
- `@GeneratedValue` : 기본키 생성을 데이터베이스에게 위임 (자동 생성)
✨ OSIV
- Open Session in View
- 여기서 세션은 영속성 컨텍스트를 지칭
- 영속성 컨텍스트를 뷰까지 열어둠 -> 뷰에서 지연로딩 가능
- JPA에서는 OEIV로 부른다
- 근데 잘 모르겠으니... 나중에 다시 공부해 봐야겠다
✨ 참고 자료
'Spring > JPA' 카테고리의 다른 글
[Spring] 로그인 (쿠키, 세션) (0) | 2024.01.10 |
---|---|
[스프링] JPA_S7 : 쿼리 파라미터와 변경 감지 & 병합 (3) | 2024.01.09 |
[스프링] JPA_S6 : 주문 도메인 개발 (테스트 코드, 리다이렉트, Valid) (1) | 2024.01.08 |
[Spring] 스프링 패턴, JPA 기본 개념과 스프링 패키지 정리 (1) | 2023.11.23 |
[스프링] JPA_S5 : 상품 도메인 개발 (0) | 2023.11.14 |