스프링 부트 교재 참고
01. 자바 백엔드 개발자가 알아두면 좋은 지식
서버와 클라이언트
✔ 클라이언트(Client) : 서버에 요청하는 프로그램
✔ 서버(Server) : 클라이언트 요청을 받아 처리하는 주체
eg) 웹 브라우저에 주소 입력 : 클라이언트가 '새로운 화면을 그리기 위한 data를 달라'는 데이터 요청을 서버에 보낸다.
데이터베이스
✔ DBMS
- RDB(Relational Database) : data 저장, 삭제, 질의가 편리하나 성능 올리기 쉽지 않음.
- SQL (Structed Query Language) : 데이터 검색 언어
- NoSQL : DB 성능을 올릴 수 있다. 성능을 올리기 위해서는 스케일 업(장비 업그레이드), 스케일 아웃(머신을 여러 대로 분리-데이터베이스를 분산하는데 이 때 트랜젝션을 사용하면 성능 떨어져서 NoSQL이 등장하게 되었다.)
- 다이나모디비, 카우치베이스, 몽고디비
02. 스프링 부트
Enterprise Application
- 대규모의 복잡한 data를 관리하는 app
- 서버 성능, 안정성, 보안이 중요하다.
- Spring/SpringBoot는 Enterprise App 개발할 때 사용한다.
- Spring Framework가 서버 성능, 안정성, 보안을 제공하여 Enterprise App 개발에 용이하다. 개발자는 개발에만 집중할 수 있다.
Spring과 Springboot
- Enterprise Application 관리를 위해 Spring이 등장했다.
Spring Framework는 서버 성능, 안정성, 보안을 매우 높은 수준으로 제공하나 설정이 매우 복잡하다는 단점이 있어 단점을 보완하고자 Springboot가 출시되었다.
Spring보다 Springboot에서 더 나아진 점
- 개발에 필요한 환경이 자동 로드 (스프링core, 스프링 mvc)
- WAS(웹앱 실행 서버)를 자체적으로 가진다.
- JAR파일로 앱 실행이 가능하다.
03. Spring의 컨셉
✅ I.C(Inversion of Control) 제어의 역전
- 객체 제어를 직접 생성,제어하지 않고 Spring Container에서 관리하는 객체를 가져와 사용한다.
(java에서는 필요한 곳에서 직접 객체를 생성하고 관리했음.)
- Spring에서는 Spring Container가 객체를 관리하고 제공한다.
- 객체 간 의존 관계 설정, 객체의 생성, 관리를 개발자가 아닌 framework가 대신함.
✅ DI(Dependency Injection) 의존성 주입
- 제어의 역전을 구현하기 위해 사용하는 방법
- Spring Container에서 필요한 객체를 생성 후 주입받아 사용한다.
- @Autowired : Spring Container에 있는 bean(Spring Container에서 관리하고 제공하는 객체)을 주입
✅ 관점 지향 프로그래밍(Aspect Oriented Programming)
✅ 이식 가능한 서비스 추상화(PSA)
- interface 개념과 비슷하게 추상화된 다양한 서비스들을 일관된 방식으로 사용하도록 함.
04. Springboot 둘러보기
✅ Spring boot start : 의존성이 모여있는 그룹, 필요한 기능을 간편히 설정할 수 있다.
build.gradle의 dependencies 에 추가한다.
spring-boot-starter-{worktype}
| worktype | 내용 |
|---|
| web | Spring MVC 를 사용해 Restful 웹서비스 사용시 의존성 모음 |
| test | Spring App test시 필요한 의존성 모음 |
| validation | 유효성 검사를 위해 필요한 의존성 모음 |
| actuator | 모니터링을 위해 앱에서 제공하는 다양한 정보를 제공하기 쉽게하는 의존성 모음 |
| data-jpa | ORM을 사용하기 위한 인터페이스 모음인 JPA를 사용하기 위한 의존성 모음 |
✅ 스프링 부트3과 자바 버전
스프링 부트2 : 자바 8 버전 이상
스프링 부트3 : 자버 17 버전 이상
✅ 스프링부트 코드 이해하기
@SpringBootApplication : java의 main()메서드와 같다. 스프링 부트에 필요한 기본 설정을 해준다.
05. Springboot 구조

✅ Presentation 계층
✅ Business 계층
- 모든 비지니스 로직을 처리
- Persistance 계층에서 제공하는 서비스를 사용할 수도 있고, 권한을 부여하거나 유효성 검사를 하기도 함.
✅ Persistance 계층
- 모든 Storage 관련 로직을 처리
- 이 과정에서 DB에 접근하기 위한 객체인 DAO를 사용할 수 있음.
06. Springboot Test
작성한 코드가 의도에 맞게 동작하는지 확인하기 위해 작성하는 코드
Test code 패턴 중 given-when-then 패턴 사용
- given : 테스트 실행 준비
- when : 테스트를 진행한다.
- 새로운 메뉴가 제대로 만들어 졌는지 확인한다.
- then : 테스트 결과를 검증한다.
- 새로운 객체 호출 값이 기대값과 같은지 확인한다.
07. DB 조작이 편해지는 ORM
✅ ORM (Object Relational Mapping)
- 자바 객체와 DB를 연결하는 프로그래밍 기법
- ORM에도 여러 종류가 있음. JAVA에서는 JPA를 표준으로 사용.
✅ JPA (Java Persistance API)
- JPA (Java Persistance API)는 관계형 데이터 베이스를 사용하는 방식을 정의한 Interface
- hibernate : ORM framework, JPA의 대표적인 구현체, 내부적으로 JDBC API사용

-
장점 : 사용하는 언어로 DB접근가능 / 객체지향적 사용 / DBMS에 대한 종속성이 낮음 / 매핑하는 정보가 정확해 ERD(Entity-Relationship Diagram)에 대한 의존도가 낮음 / 유지보수 시 유리
-
단점 : 프로그램이 복잡해 질수록 난이도가 올라감
- 복잡하고 무거운 쿼리는 ORM으로 해결 불가능한 경우 있음
-
JPA의 중요한 Concept : Entity Manager, 영속성 Context
-
✅ Entity Manager
- Entity 를 관리해 DB와 APP사이에서 객체를 생성, 삭제, 수정 관리
- Entity Manager Factory를 통해 만들어짐.
- Entity Manager Factory는 Spring내부에서 생성된다.
- @PersistenceContext, @Autowired를 통해 사용 가능.
- 스프링 부트는 기본적으로 빈을 하나만 생성해 공유하므로 동시성 문제가 발생할 수 있다.
- proxy(가짜) Entity Manager를 사용하고 필요시 DB 트렌젝션과 관련된 실제 Entity Manager 호출해 쿼리한다.
- Spring Data JPA에서관리 하므로 직접 관리할 필요가 없다.
-
✅ 영속성 컨텍스트
- Entity를 관리하는 가상의 공간으로 Entity Manager는 Entity를 영속성 컨텍스트에 저장한다.
- DB접근을 최소화해 성능을 높인다.
- 기본 특징
- 1차 캐시
- 캐시해 놓고 필요할 때 DB를 안 거치고 사용한다.
- 쓰기 지연
- 트렌젝션 commit 전까지는 쿼리를 모았다가 commit하면 모았던 쿼리 한 번에 실행, DB시스템 부담을 줄인다.
- 변경 감지
- 트렌젝션 commit시 1차 캐시에 저장된 Entity값과 현재 Entity값을비교 후 반영하여 DB시스템 부담을 줄인다.
- 지연 로딩
- 쿼리로 요청한 DATA를 앱에 바로 로딩하지 않고 필요할 때 조회한다.
-
✅ Entity 상태 4가지
- detached :영속성 컨텍스트가 관리하고 있지 않는 분리 상태
- managed : 영속성 컨텍스트가 관리하는 관리 상태
- transient : 영속성 컨텐스트와 관계가 없는 비영속 상태
- removed : 삭제된 상태
public class EntityManagerTest {
@Autowired
EntityManager em;
public void example() {
//transient : 엔티티 매니저가 엔티티를 관리하지 않는 상태
Member member = new Member(1L, "홍길동");
//managed : 엔티티가 관리되는 상태
em.persist(member);
//detached : 엔티티 객체가 분리된 상태
em.detach(member);
//removed : 엔티티 객체가 삭제된 상태
em.remove(member);
}
}
✅❕ 스프링 데이터와 스프링 데이터 JPA
Spring data JPA : JPA를 쓰기 편하게 만든 모듈
-> interface : PagingAndSortingRepository를 상속받아 JpaRepository만듦
- CRUD를 포함한 여러 메서드가 포함되어있으며 알아서 쿼리를 만들어줌.
- 리포지터리 역할을 하는 인터페이스를 만들어 데이터베이서의 테이블 조회, 수정, 생성, 삭제 같은 작업을 간단히 할 수 있다.
//JpaRepository를 상속받고,
//제네릭에는 관리할 <엔티티이름, 엔티티의 기본키 타입> 입력하면 기본 CRUD 메서드 사용 가능
public interface MemberRepository extends JpaRepository<Member, Long>{}
- 각 DB의 특성에 맞춰 기능을 확장해 제공한다.
- 표준 스펙인 JPA는 스프링에서 구현한 스프링 데이터 JPA
- 몽고디비는 스프링 데이터 몽고 디비 사용

08. Rest API
✅ Rest API(Representational State Transfer)
- URL의 설계방식
- 주소와 메소드만 보고 요청 내용 파악 가능
✅ 규칙
- URL에는 동사쓰지 않고 자원만 표시
- 동사는 HTTP 메서드로 표시
| 설명 | 적합한 HTP 메서드와 URL |
|---|
| id가 1인 블로그 글을 조회하는 API | GET /articles/1 |
| 블로그글 추가하는 API | POST /articles |
| 블로그글 수정하는 API | PUT /articles/1 |
| 블로그글 삭제하는 API | DELETE /articels/1 |
09. 앞으로 진행할 프로젝트
블로그 만들기 프로젝트 글 새로 만들어서 프로젝트 구조 정리 후 링크 공유 예정입니다 :)