https://velog.io/@seungho1216/
Spring Boot
스프링 부트(Spring Boot)는 스프링(Spring)을 더 쉽게 이용하기 위한 도구이다. 스프링 이용하여 개발을 할 때, 이것저것 세팅을 해야 될 요소들이 많은데, Spring Boot는 매우 간단하게 프로젝트를 설정할 수 있게 하여 Spring 개발을 조금 더 쉽게 만들어주는 역할을 한다.
User는 스프링을 사용하기 위해서 이것저것 다양한 설정을 직접 해줘야된다는 문제점이 있다. 개발자가 실행환경이나 의존성 관리 등의 인프라 관련 등에 쓰는 에너지가 소요되는데, 프로그래밍을 하는 데 있어 매우 중요한 비즈니스를 만들기 위한 프로그래밍에 조금 더 에너지를 투입할 수 있게 Spring의 많은 부분을 자동화하였고, 많은 개발자들이 현재 Spring Boot을 이용하여 개발을 진행하고 있다.
참고 : https://melonicedlatte.com/2021/07/11/174700.html
Controller
Spring Framework의 Controller는 사용자가 화면(View)단에서 입력이나 어떤 이벤트를 했을 경우, 그 이벤트에 맞는 화면(View)이나 비지니스 로직(Model)을 실행할 수 있도록 업데이트 해주는 역할을 한다. 즉, Model과 View를 연결해주는 다리 역할 이라고 할 수 있다. 서버에서 기능별 URL이라는 API를 개설해 놓았고, 클라이언트는 필요한 정보를 얻기 위해 적절한 API에 요청한다. 즉 Controller는 이런 창구 역할을 하는 API들을 모아놓은 클래스라고 할 수 있다.
Front-end에서 들어오는 클라이언트 측의 요청이 가장 먼저 서버 측과 맞닿는 부분
Client의 요청을 받았을 때 그 요청에 대해 실제 업무를 수행하는 Service를 호출
클라이언트가 보낸 데이터가 있다면 Service를 호출할 때 전달하기 쉽게 데이터의 가공
모델의 업무 수행이 완료되면 그 결과를 바탕으로 화면을 구성하도록 View에 전달
@Controller 어노테이션을 사용하여 만들어진 컨트롤러 클래스에 라우팅(Routing)할 수 있도록 요청 URL에 대해 해당하는 메소드를 매핑해줄 수 있도록 하기 위해 @RequestMapping 어노테이션을 사용한다.
참고 : https://yongku.tistory.com/2348
Service
Service : Controller의 요청을 받아 알맞은 정보를 가공 Controller에게 재전달한다.
Service는 위에서 언급했듯이 Repository에서 얻어온 정보를 바탕으로 자바 문법을 이용하여 가공 후 다시 Controller에게 정보를 보내는 곳이다.
클라이언트 즉 controller 쪽에서 바로 데이터베이스에 접근하여 정보를 얻고 가공해서 가져가는 것은 위험하다.
정보를 직접 CRUD하고 가공하는 과정에서 테이블에 저장된 원본의 정보가 손상될 우려가 크기 때문이다.
따라서 정보 변동의 위험이 큰 로직은 Service에서 진행한다.
추가로 이때 원본의 데이터를 사용하는 것이 아니라 데이터베이스에서 추출한 정보의 복사본인 DTO를 만들어서 로직을 조작한다.
참고 : https://velog.io/@seungho1216/Spring-BootController-Service-Repository%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC
Repository
Repository는 직역해도 '저장소'로 데이터베이스와 깊은 연관이 있음을 알 수 있다.
데이터단에 직접 매칭되는 Entity라는 것이 있는데, 이 Entity를 통해 데이터 테이블이 생성이 되면, 받아온 정보를 데이터베이스(ex. MySQL, mariaDB)에 저장하고 조회하는 기능을 수행한다.
Repository : Entity에 의해 생성된 DB에 접근하는 메서드를 사용하기위한 interface이다.
JPA를 상속받음으로써 기본적인 CRUD의 동작(함수 사용)이 가능해진다.
JpaRepository<대상 엔티티, Entity에 접근할 객체의 Type>
< 중간 정리 >
출처 : 스파르타코딩클럽 스프링 입문 강의자료
컨트롤러 : @Controller (프레젠테이션 레이어, 웹 요청과 응답을 처리함)
로직 처리 : @Service (서비스 레이어, 내부에서 자바 로직을 처리함)
외부I/O 처리 : @Repository (퍼시스턴스 레이어, DB나 파일같은 외부 I/O 작업을 처리함)
DAO, DTO, VO 란?
DAO
DAO(Data Access Object) 는 데이터베이스의 data에 접근하기 위한 객체. DataBase에 접근 하기 위한 로직 & 비지니스 로직 을 분리하기 위해 사용한다.
DTO
DTO(Data Transfer Object) 는 계층 간 데이터 교환을 하기 위해 사용하는 객체 로, DTO는 로직을 가지지 않는 순수한 데이터 객체(getter & setter 만 가진 클래스)이다.
유저가 입력한 데이터를 DB에 넣는 과정을 보면,
유저가 자신의 브라우저에서 데이터를 입력하여 form에 있는 데이터를 DTO에 넣어서 전송한다.
해당 DTO를 받은 서버가 DAO를 이용하여 데이터베이스로 데이터를 집어넣는다.
VO
VO(Value Object) 값 오브젝트로써 값을 위해 쓰인다. read-Only 특징(사용하는 도중에 변경 불가능하며 오직 읽기만 가능)을 가진다.
DTO와 유사하지만 DTO는 setter를 가지고 있어 값이 변할 수 있다.
참고 : https://melonicedlatte.com/2021/07/24/231500.html
Entitiy
데이터베이스는 엑셀처럼 2차원 테이블이라고 생각하면 되는데, 이 테이블에 서비스에서 필요한 정보를 다 저장하고 활용하게 된다. 엑셀의 세로의 열 부분이 Column 이고, 가로의 행 부분이 엔티티 객체가 된다. 이 테이블 전체가 엔티티 이고, 각 1개의 행들이 엔티티 객체 가 되는 것이라고 생각하면 된다.
실제 DB에 저장되는 내용들을 구현하는 class이다.
테이블에 대응하는 하나의 클래스라고 생각
하나의 객체가 DB의 하나의 Column처럼 작용한다.
참고 : https://velog.io/@jayjay28/%EC%97%94%ED%8B%B0%ED%8B%B0Entity
Annotation
사전적 의미로는 주석이라는 뜻이다.
자바에서 Annotation은 코드 사이에 주석처럼 쓰이며 특별한 의미, 기능을 수행하도록 하는 기술이다. - 프로그램에게 추가적인 정보를 제공해주는 메타데이터라고 볼 수 있다. - meta data : 데이터를 위한 데이터
참고(꼭 읽어보기) : https://velog.io/@ruinak_4127/Annotation%EC%9D%B4%EB%9E%80
JPA
Java 진영에서 ORM(Object-Relational Mapping) 기술 표준으로 사용하는 인터페이스 모음
자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스
인터페이스 이기 때문에 Hibernate, OpenJPA 등이 JPA를 구현함
참고로, JPA는 수정 메소드를 제공하지 않는다. 하지만 당연히 수정은 필요하기 때문에 JPA는 데이터 수정시, 매핑된 객체(테이블 데이터)를 조회해서 값을 변경 후 커밋하면 DB 서버에 UPDATE 문을 전송하여 UPDATE를 실행한다.
추가적으로 알아둬야 할 것은, 스프링에서 흔히 사용하는 것으로 알고있는 JPA는, JPA를 이용하는 spring-data-jpa 프레임워크이지 JPA는 아니다.
참고 : https://dbjh.tistory.com/77
@RequestParam, @PathVariable, @RequestBody
@RequestBody
요청이 온 데이터(JSON이나 XML형식)를 바로 Class나 model로 매핑하기 위한 Annotation 이다.
POST나 PUT, PATCH로 요청을 받을때에, 요청에서 넘어온 body 값들을 자바 타입으로 파싱해준다.
HTTP POST 요청에 대해 request body에 있는 request message에서 값을 얻어와 매핑한다.
RequestData를 바로 Model이나 클래스로 매핑한다.
이를테면 JSON 이나 XML같은 데이터를 적절한 messageConverter로 읽을 때 사용하거나 POJO 형태의 데이터 전체로 받는 경우에 사용한다.
@RequestParam
@PathVariable과 비슷하다.
request의 parameter에서 가져오는 것이다. method의 파라미터에 사용된다.
?moviename=thepurge 와 같은 쿼리 파라미터를 파싱 해준다.
HTTP GET 요청에 대해 매칭되는 request parameter 값이 자동으로 들어간다.
url 뒤에 붙는 parameter 값을 가져올 때 사용한다.
@RequestParam 어노테이션의 괄호 안의 문자열이 전달 인자 이름(실제 값을 표시)이다.
@PathVariable
method parameter 앞에 사용하면서 해당 URL에서 {특정값}을 변수로 받아 올 수 있다.
HTTP 요청에 대해 매핑되는 request parameter 값이 자동으로 Binding 된다.
uri에서 각 구분자에 들어오는 값을 처리해야 할 때 사용한다.
REST API에서 값을 호출할 때 주로 많이 사용한다.
< 간단 정리 >
@RequestParam : GET 방식으로 넘어온 URI의 queryString을 받기 적절
@PathVariable : URI 경로의 일부를 파라미터로 사용할 때 이용
@RequestBody : x ml이나 json 기반의 메시지를 사용하는 요청의 경우 유용
참고 :
https://velog.io/@ruinak_4127/Annotation%EC%9D%B4%EB%9E%80
https://u0hun.tistory.com/21