프로그래밍에서 필요한 데이터를 추상화 시켜 상태와 행위를 가진 객체로 만들고 객체들간의 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다.
추상화 vs 구체화추상화 :
구체화 :
ex) 동물이 추상화 / 개가 구체화
예를 들어, '자동차'라는 개념을 생각해보겠습니다.
🚗 자동차는 핸들이 있고, 바퀴가 있고, 달릴 수 있습니다. 하지만 어떤 자동차든 공통적으로 가지는 특징만 뽑아낸다면,
'핸들이 있다','바퀴가 있다','달릴 수 있다'와 같은 기본적인 설계(추상화) 가 될 것입니다.그런데 자동차에도 여러 종류가 있죠?
스포츠카는 빠르게 달리고,
전기차는 배터리로 움직이고,
트럭은 짐을 나르는 데 특화되어 있습니다.
이렇게 각각의 자동차가 추상적인 개념을 기반으로 실제 동작 하도록 만든 것이 구체화입니다.💡 즉, 추상화는 설계도이고, 구체화는 그 설계도를 기반으로 만든 실제 자동차라고 생각하면 됩니다!
프로그래밍에서 이를 적용하면,
class나 interface를 사용해서 '자동차의 기본 개념(추상화)'을 정의하고,
extends나 implements를 통해 '스포츠카, 전기차 등의 구체적인 동작(구체화)'을 구현하는 방식으로 사용됩니다.
결국, 저는 개발자로서 핵심 개념을 추출해서 설계하고(추상화), 이를 기반으로 구체적인 객체를 구현하는 능력(구체화)을 갖추고 있습니다!"
소프트웨어 개체(클래스, 모듈, 함수 등)는 확장에 대해 열려 있어야 하고, 변경에 대해서는 닫혀 있어야 한다.
상위 타입은 항상 하위 타입으로 대체할 수 있어야 한다.
변경에 대비해라
구체적인 것(특정 오브젝트나 구현체)에 의존하면 그것이 변경될 경우 의존하는 것도 변경되어야 한다.(구체적인 것은 쉽게 변경된다)
그래서 추상적인 것에 의존하도록 구조를 변경하는 것이 의존성 역전(쉽게 변경되지 않는 추상적인 것에 의존해라)
첫째, 상위 모듈은 하위 모듈에 의존해서는 안 된다. 상위 모듈과 하위 모듈 모두 추상화에 의존해야 한다.
둘째, 추상화는 세부 사항에 의존해서는 안 된다. 세부 사항이 추상화에 의존해야 한다.
의존성 주입이란?
필요로 하는 오브젝트들을 직접 만들지 않고 전달받도록 한다.
의존한다? 이건 코드 내에 관련 코드가 있어야한다.
예를 들면 상품Entity안에 상품옵션클래스가 들어있다? = 의존한다
상품옵션Entity에 상품클래스가 안들어있다 = 의존하지 않는다.
왜?
1. 테스트하기 편하다
추상화 (Abstraction)
불필요한 정보는 숨기고, 중요한 정보만 표현
예: 자동차의 운전자는 가속, 브레이크만 알면 되고, 엔진 내부 구조는 몰라도 됨.
캡슐화 (Encapsulation)
데이터(변수)와 기능(메서드)을 하나로 묶고, 외부에서 직접 접근하지 못하도록 제한
예: 클래스 내부의 private 변수는 외부에서 직접 접근 못함 → getter/setter로 조작
상속 (Inheritance)
기존 클래스를 확장해 새로운 클래스를 만드는 것
예: Bird 클래스 → Penguin, Eagle 등이 상속받아 공통 기능 재사용
다형성 (Polymorphism)
같은 인터페이스(또는 부모 클래스)를 통해 서로 다른 구현을 사용할 수 있음
예: Animal 클래스의 speak() 메서드는 Dog, Cat 클래스에서 각각 다르게 구현됨
어떤 객체를 만들기 위한 틀이며, 객체가 가져야 할 속성과 기능을 정의
controller의 역할
Service : 비지니스로직
리포지토리 : 데이터베이스(데이터 저장,읽기,조회,수정,삭제 모든 것을 관리한다)
자바 스크립트 -> 자바스크립트 오브젝트로 변환 -> http(json형태로 http를 거침)-> 자바 스프링 -> 자바 오브젝트(dto / entity) -> 데이터 베이스에 저장
엔티티가 return 타입으로 사용하면 안되는 이유
1. Api spec이 바뀌면 안돼 - 왜? 개발은 협업 -> 협업하는 사람들과의 필요한 약속
2. 엔티티를 바꾸고 싶은데 api spec이랑 연결되면 절대 수정할 수가 없다. 그래서 retrurn타입에 엔티티를 사용할 수 없는것
Controller / service에서 써도 되냐 ? -> api와 연관이 있냐? -> 파라미터에 들어간다고 api와 연관이 되는건 아니다.
엔티티가 api spec과 같으면 안된다
로그인할 때의 문제점
-> 데이터베이스에서 하나의 작업 단위
: 모두 성공하거나 모두 실패하는 작업 묶음입니다.
-> 다른 트렌젝션의 영향을 받지 않겠다. 내가 읽고 있을 때는 바뀐내용을 모른다는 것
-> 중간에 커밋된 내용은 읽지 않겠다
REST의 원리를 따르는 API를 의미
REST란?
이런 Rest의 원칙을 완전히 따르지 않는 것이 rest api 라면 철저하게 지키는 원칙이 Restful api이다.
즉, Restful api가 더 엄격하게 rest의 형태를 지켜야한다.
데이터베이스에서 두 개 이상의 테이블을 연결해서 관련된 데이터를 함께 조회할 때 사용하는 기능
spring의 jpa를 활용해서 사용
원하는 정보를 쉽고 빠르게 찾을 수 있는 기술
읽기를 사용할 땐, 좋은 성능을 주지만
쓰기가 많이 바뀔 땐 나쁘다
특징
Spring Framework: 자바 기반의 애플리케이션 개발을 위한 프레임워크Spring Boot: spring을 더 쉽고 빠르게 사용할 수 있도록 도와주는 도구
| 구성 요소 | 역할 | Spring에서의 예 |
|---|---|---|
| Model | 비즈니스 데이터, 로직 | Model, DTO, Entity, Service, Repository |
| View | 사용자에게 보여질 화면 | Thymeleaf, JSP, HTML |
| Controller | 요청 받고 응답 결정 | @Controller, @RestController |
사용자 요청을 Controller가 받아서 비즈니스 로직을 처리한 후 Model 데이터를 View에 전달.
@RequestMapping: 모든 HTTP 메서드를 처리
@GetMapping, @PostMapping 등이 RequestMapping안에 속해있는 것
자바 객체와 관계형 데이터베이스(RDB)를 매핑해주는 ORM 기술 : SQL 없이도 자바 코드만으로 DB를 다룰 수 있게 해줌
(ORM = Object Relational Mapping → 자바 객체 ↔ RDB 테이블 자동 연결)
ex)
@Entity : 이 클래스는 DB 테이블과 연결된다!
@Id, @Column, @GeneratedValue 등으로 필드와 컬럼을 매핑
EntityManager 또는 Spring에서는 JpaRepository로 DB 조작
JPA vs Hibernate vs Spring Data JPA?
- JPA: 자바 진영의 표준 인터페이스 (API)
- Hibernate: JPA를 구현한 라이브러리 (가장 널리 쓰임)
- Spring Data JPA: JPA 위에 얹은 스프링 확장 라이브러리
→ JpaRepository 등 자동 기능 추가
프로그래밍 언어의 객체와 데이터베이스의 테이블을 자동으로 연결해주는 기술
SQL로 작성했던 데이터베이스에 의존하지 않고, 추상화작업이 가능하다.
where절 / 조건에 따라 쿼리가 유동적으로 바뀌는 것
JavaScript 라이브러리 중 하나로, 웹 페이지를 쉽게 조작할 수 있게 도와주는 도구
but 현재는 잘 안씀. why? 리엑트 같이 프론트엔드 프레임워크가 새로 나와 편리하게 사용할 수 있기 때문에
오라클과 비교했을 때
| 항목 | PostgreSQL | MySQL |
|---|---|---|
| SQL 표준 준수 | 높음 (엄격하게 따름) | 낮음 (유연하나 일부 비표준) |
| 트랜잭션 및 동시성 | MVCC 지원, 트랜잭션 처리에 강함 | InnoDB 엔진 사용 시 MVCC 지원되지만 복잡한 처리에선 한계 |
| 데이터 무결성 | CHECK, 외래키 제약 등 완전 지원 | CHECK 제약 조건은 형식만 존재 (실제로는 무시됨) |
| 확장성 및 커스터마이징 | 확장 모듈, 사용자 정의 함수 등 커스터마이징 쉬움 | 커스터마이징은 제한적 |
| 복잡한 쿼리 처리 | CTE, 윈도우 함수 등 고급 SQL 처리에 강함 | 복잡한 쿼리 최적화에 약한 편 |
| JSON 지원 | JSON, JSONB로 고성능 제공 | JSON 컬럼은 있지만 인덱싱 제한적 |
| GIS 기능 | PostGIS 확장으로 강력함 | GIS 기능은 비교적 단순 |
| 속도 | 쓰기, 대용량 분석 등에서 강점 | 단순 읽기 성능은 빠른 편 |
| 사용 사례 | 데이터 분석, 복잡한 로직이 많은 앱 | 웹사이트, 블로그 등 가벼운 트래픽 중심 앱 |
- MySQL: 단순하고 빠르며, 웹 중심 애플리케이션에 적합
- PostgreSQL: 복잡한 로직, 데이터 분석, 정교한 데이터 무결성 보장이 필요한 서비스에 적합
- Oracle: 유료
SQL을 직접 작성해 자바 객체와 매핑해주는 프레임워크
(ORM보다는 SQL Mapper에 가까운 구조)
-> JPA처럼 자동 매핑보다는 SQL을 개발자가 명시적으로 제어할 수 있음
: 복잡한 쿼리가 많은 프로젝트에서 주로 사용
이 변수는 수정할 수 없는 변수이다. 라고 저장해두는 변수
이름이 같은 함수를 여러 개 만들어 두는 것.
-> 원래 이름이 같은 함수가 있으면 호출할 때 구분이 안 되기 때문에 문제가 있다.
그러나 Java에서는 파라미터가 다르면 함수 이름이 같아도 구분함.
상위 클래스에서 가지고 있는 함수를 자식 클래스에서 재정의 하는 것