Spring/JPA

[Spring] 개념 정리

ajeong7038 2024. 1. 12. 23:28

`스프링 핵심 원리 - 기본편` 강의를 듣고 정리한 자료입니다

 

✨ 객체 지향

특징

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로 부른다

- 근데 잘 모르겠으니... 나중에 다시 공부해 봐야겠다


✨ 참고 자료

https://velog.io/@janeljs/JPA-Open-Session-In-View