[Springboot] 스프링 부트 기초 다지기

LV UP·2023년 10월 3일

Backend

목록 보기
1/6

스프링 부트 교재 참고


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내용
webSpring MVC 를 사용해 Restful 웹서비스 사용시 의존성 모음
testSpring App test시 필요한 의존성 모음
validation유효성 검사를 위해 필요한 의존성 모음
actuator모니터링을 위해 앱에서 제공하는 다양한 정보를 제공하기 쉽게하는 의존성 모음
data-jpaORM을 사용하기 위한 인터페이스 모음인 JPA를 사용하기 위한 의존성 모음

✅ 스프링 부트3과 자바 버전

스프링 부트2 : 자바 8 버전 이상
스프링 부트3 : 자버 17 버전 이상

✅ 스프링부트 코드 이해하기

@SpringBootApplication : java의 main()메서드와 같다. 스프링 부트에 필요한 기본 설정을 해준다.


05. Springboot 구조

✅ Presentation 계층

  • HTTP 요청을 받고 비지니스 계층으로 전송

✅ 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를 연결하는 프로그래밍 기법
    • 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의 설계방식
  • 주소와 메소드만 보고 요청 내용 파악 가능

✅ 규칙

  1. URL에는 동사쓰지 않고 자원만 표시
  2. 동사는 HTTP 메서드로 표시
  • eg)
설명적합한 HTP 메서드와 URL
id가 1인 블로그 글을 조회하는 APIGET /articles/1
블로그글 추가하는 APIPOST /articles
블로그글 수정하는 APIPUT /articles/1
블로그글 삭제하는 APIDELETE /articels/1

09. 앞으로 진행할 프로젝트

블로그 만들기 프로젝트 글 새로 만들어서 프로젝트 구조 정리 후 링크 공유 예정입니다 :)

profile
개발 블로그

0개의 댓글