그냥 블로그

[Back-end] 스프링 부트/JSP 폴더 구조와 각 기능 본문

프로젝트/WALFI

[Back-end] 스프링 부트/JSP 폴더 구조와 각 기능

코딩하는 공대생 2024. 6. 13. 23:21
반응형

JSP 폴더 구조와 기능 

API를 추가해야 하기 때문에, JSP의 폴더구조를 한 번 파악해야 할 것 같다... 

우리 프로젝트는 계층형 구조로 되어 있음. 스프링 부트

 

1. 용어 정리

DAO

DAO(Data Access Object)는 데이터 베이스에 접근하기 위한 객체. DataBase에 접근하기 위한 로직 & 비지니스 로직 분리를 위해 사용

 

DTO

DTO(Data Transfer Object)는 계층 간 데이터 교환을 하기 위해 사용하는 객체, DTO는 로직을 가지지 않는 순수한 데이터 객체(getter & setter 만 가진 클래스)

 

VO

VO(Value Object)는 값 오브젝트로써 값을 위해 쓰인다. read-Only 특징(사용하는 도중에 변경 불가능하고, 오기 읽기만 가능)을 갖고 있다.

=> DTO와 유사하지만 VO는 getter만 가진 클래스 

 


2. Spring web Layer

 

스프링에는 5가지 요소가 존재

1. Web Layer

  • 컨트롤러(@Controller)가 대표적이고, 이외에도 필터(@filter), 인터셉터, 컨트롤러 어드바이스 등이 포함
  • 외부 요청과 응답에 대한 전반적인 영역 의미

2. Service Layer

  • 말 그대로 서비스(@Service)
  • 일반적으로 컨트롤러와 저장소(Rpository, Dao)의 중간 위치
  • 트랜잭션(@Transactional)과 도메인 간 연산 순서 보장

3. Repository Layer

  • DB와 같은 데이터 저장소에 접근하는 여역
  • JPA를 사용한다면 @Repository를 생각
  • DAO라고도 함

4. DTOs

  • DTO(Data Transfer Object)는 계층 간 데이터 교환을 위한 객체 

5. Domain Model

  • 개발 대상, 즉 도메인을 모든 사람이 동일한 관점에서 이해할 수 있고 공유할 수 있도록 단순화 한 것을 도메인 모델이라 함. 
  • 비즈니스 로직 처리
  • JPA를 사용한다면, @Entity가 사용되는 영역 또한 도메인 영역이다. 

 

3. 동작 과정

  1. Client(View)에서 DTO를 통해 요청 보냄
  2. DTO를 통해 Controller에 도착하면 Controller에서는 Service(비즈니스 로직) 호출 이때, DTO를 통해 전달
    - 어떤 Service(비즈니스 로직)으로 갈지 조합한다는 느낌
  3. Service로 오면 도착한 Service의 비즈니스 로직을 처리한다.
  4. Service는 비즈니스 로직을 실행하는 도중 DB에 접근해야하는 경우 Repository로 이동해 접근
  5. Repository는 DB에 접근하는 소스코드가 존재해 DB에 접근하고 쿼리문을 통한 트랜잭션을 실행할 경우 Domain 호출
  6. Domain은 DB 테이블과 직접 매핑되는 비즈니스 로직들이 존재하는 것으로 JPA를 사용하면 @Entity가 선언된다.

 


4. 프로젝트 폴더 분석 

1) Controller
  • MVC에서 C에 해당하며 주로 사용자의 요청을 처리한 후 지정된 뷰에 모델 객체를 넘겨주는 역할을 한다. 
Controller 관련 대표적 Annotation

 

1) @Controller -> @RestController

  • Controller의 역할을 수행 한다고 명시 (해당 클래스를 Controller로 사용한다고 Spring FrameWork에 알린다)
  • 필요한 비즈니스 로직을 호출해 전달할 모델과 이동할 뷰 정보를 DispatherServlet에 반환
  • Bean으로 등록
  • @Component의 구체화 된 어노테이션

2) @RequestMapping

  • 요청에 대해 어떤 Controller, 어떤 메소드가 처리할지 매핑하기 위한 어노테이션
  • 클래스나 메서드 선언부에 @RequestMapping과 함께 URL을 명시해 사용한다.
  • viewName 생략 시 @RequestMapping의 path로 설정한 URL이 default viewName

  RequestMapping 속성들

  • Value(String[]) : URL 값
@RequestMapping(value="/login")
@RequestMapping("/login")
  • method(RequestMethod[]) : HTTP Request 메소드 값
    • GET, POST, HEAD, OPTIONS, PUT, DELETE, TRACE
/*ex 1*/
@RequestMappint(value="/login", method=@RequestMethod.GET)
/*ex 2*/
@RequestMapping(value="/login", method=@RequestMethod.POST)
  • params(String[]) : HTTP Request 파라미터
    • @RequestParam : 사용자가 원하는 매개변수에 값을 매핑하기 위해 사용
    • @PathVariable : url 경로를 변수화해 사용할 수 있도록 함.
@PostMapping("/member")
public String member(@RequestParam String name, @RequestParam Int age)

// @Request Param은 생략 가능. 사용자가 입력한 key값과 매개변수의 이름을 비교해 값을 넣어주기 때문
@PostMapping("/member")
public String member(String name, Int age)

@RequestMapping("/member/{name}/{age}")
public String member(@PathVariable("name") String name, @PathVariable("age") String age)
  • consumes(String[]) : Request Body에 담는 타입 제한 가능 => 자주 사용되진 않는 듯  
    • EX) @PostMapping("/login", consumes="application/json")
    • 헤더에 application/json이 존재 해야 처리 
@RestController
  • Controller는 view( .html)나 data를 반환할 수 있다
  • Sprint 4.0미만은 @ResponseBody 어노테이션을 추가해 data를 반환했으나 이후로는 @RestController 로 가능하다. (@Controller 어노테이션까지 포함)
  •  
import ...

@RestController
public class TestRestController{

  @RequestMapping(value="/testValue", method = RequestMethod.GET)
  public String getTestValue(){
    String TestValue = "레스트 컨트롤러 테스트";
    return TestValue;
  }
}

 

 

2) Domain

 

실제 DB 테이블과 매핑시키는 클래스. 

lambok 을 사용해서 Getter, Setter 어노테이션 만으로 추가 가능. 

@Entity 어노테이션을 사용해서 데이터 베이스 테이블과 매칭될 클래스임을 나타낸다. 

@Builder 어노테이션을 사용해서 객체 생성 시점에 값을 넣어줄 수 있다. 

 

 

 

3) DAO(Data Acess Object) -> Repostiory(Spring Boot)

VO라고 하기도 함. 

DB로 접근해서 통신하는 기능을 오브젝트로 따로 만들어 둔 객체. CRUD

스프링부트에는 Repository를 쓰는 듯 하다. DAO 폴더가 따로 있긴 한데 유사한 기능을 수행 ( 조금 다름 ) 

 

JpaRepository 인터페이스를 상속하고 제네릭스 타입으로 <Question, Integer> 처럼 리포지터리 대상이 되는 엔티티 타입(Question) 과 해당 엔티티 PK 속성 타입을 지정한다. 

public interface ProductRepostiory extends JpaRepository<ProductInfo, String> {
    @Query(value = "select * from product_info", nativeQuery = true)
    List<ProductInfo> findAllProduct();
}

 

 

 

 

https://12716.tistory.com/entry/JSP-Servlet-DAO%EC%99%80-DTO

 

[JSP & Servlet] DAO와 DTO

DAO는 Data Access Object의 약자이고 DTO는 Data Transfer Object의 약자입니다. 둘다 객체라고 할수 있습니다. 브라우저를 통해서 웹서버쪽으로 요청을 하게됩니다. 요청을 하면 웹서버는 데이터베이스가

12716.tistory.com

https://velog.io/@dani0817/Spring-Boot-%EB%A6%AC%ED%8F%AC%EC%A7%80%ED%84%B0%EB%A6%ACRepository-%EB%9E%80

 

[Spring Boot] 리포지터리(Repository) 란?

📕 리포지터리(Repository) 만들고 Test해보기!

velog.io

 

'프로젝트 > WALFI' 카테고리의 다른 글

[Back-end] 프로젝트 백엔드 DB추가, SELECT * (JSP, MySQL)  (0) 2024.07.09
[WALFI] Recoil + React Query 도입  (0) 2024.06.14
메타 데이터  (0) 2024.05.29
[Next.js]  (0) 2024.05.24
[Next.js] 정적 및 동적 렌더링  (0) 2024.05.22