일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- TDD
- 백준 2133
- ESP32
- 페이지교체알고리즘
- tfjs
- dp
- 풀이
- 구슬탈출
- 데이터 링크 계층
- stl
- RBT
- 1796
- TDD란?
- 3XN 타일링
- Vite 사용 이유
- 구현
- 13459
- LOLIN D32
- 백준
- 테스트주도개발
- c++
- 메모리계층
- 2623
- mediastream
- OpenVidu
- WebRTC란
- 적두트리
- REACT
- 자료구조
- 9996
- Today
- Total
그냥 블로그
[Back-end] 스프링 부트/JSP 폴더 구조와 각 기능 본문
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. 동작 과정
- Client(View)에서 DTO를 통해 요청 보냄
- DTO를 통해 Controller에 도착하면 Controller에서는 Service(비즈니스 로직) 호출 이때, DTO를 통해 전달
- 어떤 Service(비즈니스 로직)으로 갈지 조합한다는 느낌 - Service로 오면 도착한 Service의 비즈니스 로직을 처리한다.
- Service는 비즈니스 로직을 실행하는 도중 DB에 접근해야하는 경우 Repository로 이동해 접근
- Repository는 DB에 접근하는 소스코드가 존재해 DB에 접근하고 쿼리문을 통한 트랜잭션을 실행할 경우 Domain 호출
- 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
[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 |