엘리스 트랙 5주차, Spring 1

junto·2024년 1월 28일
0

spring

목록 보기
1/30
post-thumbnail

한 달간 Java와 Database 기본을 배우고 이번 주부터 Spring에 대해 기본적인 내용을 배웠다. Spring MVC에 여러 내용을 알게 되어서 기쁜 마음으로 정리해 본다!

스프링 프레임워크와 스프링 부트

스프링 프레임워크

  • 애플리케이션 개발에 필요한 가치를 제공해 개발자가 비즈니스 로직 구현에만 집중할 수 있게끔 하는 것을 목표로 한다.

스프링 부트

  • 의존성 관리, 자동 설정, 내장 WAS, 모니터링 등의 기능으로 스프링 프레임워크를 편리하게 사용할 수 있도록 지원한다.

스프링 프레임워크 특징

1. POJO(Plain Old Java Object)

  • 다른 기술을 사용하지 않고 Java만을 통해서 생성한 객체를 말한다.
  • 특정 규약의 변화에 얽매이지 않아 유연하게 변화와 확장에 대처 가능하다.

2. 제어 역전(IoC, Inversion of Control)

  • 객체의 생명주기 관리를 외부(스프링 컨테이너)에 위임하여 의존관계 주입과 관점 지향 프로그래밍(AOP)이 가능하다.

3. 의존관계 주입(DI, Dependency Injection)

  • 의존관계 주입이란 사용할 객체를 직접 생성하지 않고 외부 컨테이너가 생성한 객체를 주입 받아 사용하는 방식을 말한다.
  • 생성자를 통한 의존관계 주입, 필드 객체 선언을 통한 의존관계 주입, setter 메서드를 통한 의존관계 주입 방법이 있다.

4. 관점 지향 프로그래밍(AOP, Aspect Oriented Programming)

  • 관점(Aspect)을 기준으로 묶어 개발하는 방식으로 주로 로깅과 트랜잭션과 같이 반복적으로 사용되는 부가 기능을 공통 로직으로 처리하도록 모듈화해 삽입하는 방식이다.

Maven과 Gradle

  • Java 애플리케이션 개발을 위한 빌트, 테스트, 배포 기능을 지원한다.
  1. Maven
  • Apache Maven은 XML 기반 설정 파일을 사용하고, 중앙 저장소에서 필요한 라이브러리를 다운받아 관리한다. 단순성과 일관된 프로젝트 구조를 제공한다.
  1. Gradle
  • 증분 빌드와 캐싱을 사용해 빌드 시간을 줄이고, Groovy나 Kotlin 스크립트는 Maven보다 유연하다는 장점이 있다.

CSR과 SSR

  1. CSR(Client-Side Rendering)
  • 브라우저가 서버로부터 빈 스켈레톤 HTML과 함께 필요한 CSS, JavaScrip를 받아와 웹페이지를 랜더링하는 방식이다.
  1. 클라이언트 측에서 전체 또는 일부 페이지를 동적으로 랜더링 할 수 있기에 동적인 웹 애플리케이션 제공에 적합하다.
  2. 프론트엔드 코드에 페이지 리소스들이 미리 정의되어 있다.
  3. 빠르게 반응하지만 페이지의 내용은 API 호출이 완료된 후 보여진다.
  1. SSR(Server-Side Rendering)
  • 서버에서 모든 페이지 컨텐츠를 랜더링하여 완성된 HTML을 프론드엔드로 보내는 방식이다.
  1. 로딩이 완료되면 페이지와 데이터가 한 번에 표시되며, 상대적으로 사용자기 보기에 로딩이 느려 보인다.
  2. 페이지를 이동할 때마다 다시 로딩하기 때문에 페이지가 깜빡인다.

MVC

  • 사용자 인터페이스와 비즈니스 로직을 분리하고 각각을 독립적으로 유지하여 유연하고 확장할 수 있는 코드 생산을 가능하게 한다.
  • Model-View-Controller, 소프트웨어 아키텍처 디자인 패턴의 한 종류이다.

구성 요소

  • Model
    • 데이터와 비즈니스 로직을 담당한다.
    • 데이터를 관리하고 변경이 발생하면 View에 알린다.
    • DB와 연동을 위한 DAO(Data Access Object)와 데이터 구조를 표현하는 DO(Data Object)로 구성된다.
  • View
    • 데이터를 사용자에게 보여주는 사용자 인터페이스(UI)를 담당한다.
    • 모델로부터 데이터를 받아 표현한다.
    • 사용자의 입력을 받아 컨트롤러에 전달한다.
  • Controller
    • 모델(Model)과 뷰(View) 사이 연결고리 역할을 수행한다.
    • 뷰에서 사용자 입력을 받아 모델을 업데이트한다.
    • 모델의 변경 사항을 뷰에 반영한다.

동작 방식


1. 클라이언트의 요청을 DispatcherServlet에서 수신한다
2. 요청을 처리해 줄 컨트롤러를 HanddlerMapping에게 검색을 요청한다
3. 컨트롤러 정보를 HandlerAdapter에 보내 실행 요청한다.
4. Handler Adapter는 Controller를 통해 비즈니스 로직을 실행한다
5. 실행 결과를 Model에 설정하고 ViewName을 반환한다
6. ViewName으로 View를 찾는 작업을 ViewResolver에게 요청한다
7. 반환된 View에 대한 렌더링 프로세스를 View에 요청한다.

REST API

REST

  • REpresentational State 약자
  • 자원을 이름으로 구분하여 해당 자원의 상태를 주고받는다.
  • REST 기본 원칙을 잘 지킨 서비스를 RESTful하다고 한다.

REST 구성 요소

  • 자원(Resources) - URI
    • 모든 자원에 고유한 ID가 존재한다.
    • 자원을 구별하는 ID는 /groups/:grous_id와 같은 HTTP URI
  • 행위(Verb) - HTTP Method
    • GET, POST, PUT, DELETE
  • 표현(Representations) - HTTP Message PayLoad
    • 클라이언트가 자원의 상태에 대한 조작을 요청하면 서버는 적절한 응답을 보낸다.
    • 자원은 JSON, XML, TEXT 등 여러 형태로 표현할 수 있다.

REST 특징

  • Server-Client 구조
  • StateLess(무상태)
  • Cacheable(캐시 처리 가능)
  • Layered System(계층화)
  • Uniform Interface(인터페이스 일관성)
  • Code-On-Demand(선택)

CRUD 구현

@PostMapping("/posts")
public ResponseEntity<Post> createPost(@RequestBody PostDTO postDTO) {
    Post savedPost = postService.savePost(postDTO);
    return ResponseEntity.ok(savedPost);
}
@GetMapping("/posts")
public List<Post> getAllPosts() {
    return postService.getAllPosts();
}
@PutMapping("/posts/{id}")
public Post updatePost(@PathVariable Long id, @RequestBody PostDTO postDTO) {
    postDTO.setId(id);
    return postService.updatePost(postDTO);
}
@DeleteMapping("/posts/{id}")
public void deletePost(@PathVariable Long id) {
        postService.deletePost(id);
}

여러 Annotation

  • @PostMapping, @GetMapping, @PutMapping, @PatchMapping, @DeleteMapping

    • PutMapping은 대상 자원의 전체 수정을 뜻하며, PatchMapping은 대상 자원의 부분 수정을 뜻한다.
  • @PathVariable

    • URL에서 담긴 값과 변수를 매핑하기 위해서 사용한다.
    • 변수 이름이 일치하는 경우 생략할 수 있다.
  • @RequestParam

    • GET 요청에서 쿼리 문자열을 전달하기 위해 사용되는 방식이다.
      - URL에서 ‘?’ 우측으로 ‘key=value’ 형태로 표현하고 복수의 경우 ‘&’로 연결한다
      - ex) localhost:8080/hello?name=juny&habbit=running
    • 선택적으로 기본값을 지정할 수 있으며, 필수 여부를 설정할 수 있다.
      • defaultValue, required
  • @RequestBody

    • POST, PUT과 같은 HTTP 요청에서 사용되며 요청 본문(Body)에 포함된 데이터를 자바 객체로 변환하는데 사용된다.
      - HTTP 요청 본문(Body)를 자바 객체로 자동 변환한다. 이를 위해 Jackson 같은 JSON 변환 라이브러리가 필요하다.

JDBC

기본 용어 정리

  • Entity

    • 실제 데이터베이스 테이블과 매핑시키는 클래스를 말한다.
      - 하나의 Entity를 하나의 테이블로 작성한다.
      - 클래스의 필드는 테이블 내부의 칼럼을 의미한다.
  • DTO(Data Transfer Object)
    - 데이터 전송 객체를 말한다.
    - 뷰에서 컨트롤러로 넘어오는 데이터를 담거나 컨트롤러와 서비스 사이에 주고 받는 데이터를 담는데 사용한다.

  • DAO(Data Acess Object)

    • 데이터베이스에 접근하기 위한 객체이다.
    • 서비스와 데이터베이스를 연결하기 위한 중간 다리 역할을 한다.

JDBC란

  • 데이터베이스마다 커넥션 연결 방법과 SQL 전달 방법, 결과 응답을 받는 방법이 모두 다르기에 표준 인터페이스가 필요하다.
  • 이를 위해 JDBC(Java Database Connectivty), DB 프로그래밍을 하기 위해 사용하는 표준 API(인터페이스)가 등장하게 되었다.
  • 3가지 기능을 표준 인터페이스로 정의하여 제공한다. (JDBC Driver)
    1. Connection(연결)
    2. Statement(SQL 전달)
    3. ResultSet(결과 응답)

JDBC API 단점

  • 반복되는 코드
  • 연결부터 자원의 반납까지 모든 부분 관리 필요
  • 예외 처리로 인해 코드 복잡도 상승

JDBC Template

  • Spring Framework에서 개발자가 JDBC를 쉽게 사용할 수 있도록 도와주는 템플릿 기반의 API이다.

  • 다음과 같은 이점이 있다.

    1. 구조적인 반복 해결
      • try-catch, connection 획득 종료, statement 준비 실행 종료, 결과를 가져오기 위한 resultSet, 예외 처리 등 반복을 내부적으로 처리한다.
    2. 손쉬운 Transaction 처리
      • JDBC API에선 트랜잭션을 사용하기 위해 Auto commit 설정 해제, commit을 위한 추가 코드가 필요하다. Jdbc Template를 사용할 경우 @Transactional을 이용하여 트랜잭션 처리가 가능하다.
    3. 쉽게 자바 객체로 매핑 가능
      • JDBC API를 사용할 때는 ResultSet에서 칼럼을 꺼내고 직접 매핑하는 작업이 필요하지만, JDBC를 사용하면 맵퍼를 이용해 객체 생성이 가능하다

느낀 점

이 내용을 토대로 궁금한 점들이 매우 많다. Spring MVC가 Spring Code에서는 어떻게 구현되어 있는지, 어떻게 HTTP 요청 메시지와 응답메시지를 파싱해서 적절한 컨트롤러를 찾아내는지, MVC 패턴 말고 다른 패턴을 쓸 수는 없는지, 계층간 데이터를 전달하는 과정에서 엔티티가 아닌 DTO를 사용하면 어떤 장점이 있는지, Mapper 클래스를 사용하면 DTO 변환 과정을 어떻게 효율적으로 처리할 수 있는지, JDBC Template가 기존 JDBC API를 어떻게 추상화시켰는지, 구체적으로 AOP를 어떻게 사용하는지...
포스팅할 것들이 많아져서 좋다!

  • 복습이 필요하다고 생각하던 참에 주간 테스트로 회원 도메인 CRUD 만들어보는 게 도움이 많이 되었다.

#코딩독학 #코딩인강 #코딩배우기 #개발자 #코딩이란 #코딩교육
#프론트엔드부트캠프 #백엔드부트캠프 #국비지원부트캠프 #개발자 #백엔드 #AI부트캠프 #개발자국비지원 #백엔드개발자 #프론트엔드개발자

profile
꾸준하게

0개의 댓글