서비스 로직 커짐 → 연관 데이터 + 처리해야할 로직
➡️ 프로그램 복잡도 기하급수적으로 상승
➡️ 실패 🚨
실패했던 자료와 사례를 모아둔 것 → 패턴, 아키텍쳐
📌 스프트웨어 디자인패턴
: 소프트웨어공학의 소프트웨어디자인 → 특정 문맥에서 공통적으로 발생하는 문제에 대해 재사용가능한 해결책
소스나 기계코드로 바로 전환될 수 있는 완성된 디자인 ⛔️
디자인패턴
→ 프로그래머가 어플리케이션이나 시스템을 디자인할 때, 공통된 문제들을 해결하는데 형식화 된 가장 좋은 관행
복잡한 문제를 아키텍쳐 적으로 해결하는 방법 → 문제를 나누는 방식이 가장 애용됨
서버구조
New Data
: 새로운 데이터를 처리하는 부분 → @Controller
Service Logic
: 서비스 로직을 처리하는 부분 → @Service
Old Data
: 기존의 데이터를 이용하는 부분 → @Repository
각 부분 → 스프링, 스프링부트에서 각각의 레이어로 나누어져있음
📌 Presentation 계층
: User와의 상호작용 처리계층
HTTP Request 처리 + HTML 랜더링 ⭐️
MVC Pattern (Model, View, Controller) → Presentation 계층 ⭐️
URL Mapping → 특정 메서드가 호출되도록 하는 것
📍 Spring Presentation 계층 → @Controller 어노테이션 사용
📌 Domain(Business, Service)계층
: 서비스 및 시스템의 핵심로직
Business 논리계층으로 유효성검사 및 계산
application이 수행해야하는 domain과 관련된 작업을 담당함
입력 및 저장된 Data → 계산
Data access 종류 결정
서버 프로그램 복잡성증가 → 비즈니스 로직 수행만을 위한 별도계층(Layer)필요
➡️ 프레임워크 사용으로 Presentation
, Data Access
비중 줄이고 Domain
비중증가 ✅
📍 Spring Domain 계층 → @Service 어노테이션 사용
📌 Data Access(Persistance)계층
: Database, Message Queue, 외부 API와의 통신처리
DAO 계층
Database, 원격서비스 → 영구데이터 관리방법을 분류하는 데이터 접근계층
Data source, Database → 대부분 서버 외부에 별개로 존재 ⭐️
➡️ Data Access 계층은 데이터와의 소통을 담당함
📍 Spring Data Access(Persistance) 계층 → @Repository 어노테이션 사용
📍 Presentation 계층
@Controller // #1
public class ContentController {
private final ContentService contentService; // #2
@GetMapping("/content/{contentId}") // #3
public Content getContent(@PathVariable Long contentId) { // #4
Content content = contentService.getContent(requestDto); //#2-1
return "/contentPage";
}
@PostMapping("/content")
@ResponseBody// #5
public Content createContent(@RequestBody ContentRequestDto requestDto) {
Content content = contentService.createContent(requestDto);
return content;
}
}
#1 : 해당 자바객체가 Controller 역할을 하는 객체라는 것을 알려주는 어노테이션
#2
#3 : 특정 Request → 호출될 메서드를 지정해주는 어노테이션
#4 : @PathVariable → 자동으로 일치하는 변수값을 메서드호출 시점에 같이 넘겨줌
#5 : View까지 같이 반환하느냐, JSON 형식으로 데이터만 반환하느냐를 결정하는 어노테이션
📍 Domain 계층
@Service // #1
public class ContentService {
private final ContentRepository contentRepository; //#2
public ReturnDto getContent(Long id) {
ReturnDto returnDto = contentRepository.findById(id);
return returnDto; //#3
}
public Content createContent(ContentRequestDto contentRequestDto) {
Content content = new Content(contentRequestDto);
contentRepository.save(content);
return content;
}
}
#1 : 해당 자바객체가 Service 역할을 하는 객체라는 것을 알려주는 어노테이션
#2 : 인접한 계층인 Repository 객체를 가짐
#3 : 인접한 계층으로 데이터를 전달
📍 Data Access 계층
@Repository
public interface ContentRepository extends JpaRepository<Content, Long>{}
📌 Spring, SpringBoot
- 단순 반복작업부분이 많았던 Controller와 Repository쪽을 개발관점에서 매우 쉽고 편하게 처리
- 핵심 비즈니스로직 Service단에 더 집중할 수 있도록 해줌 ⭐️