Intro. 소프트웨어 디자인패턴

  • 서비스 로직 커짐 → 연관 데이터 + 처리해야할 로직
    ➡️ 프로그램 복잡도 기하급수적으로 상승
    ➡️ 실패 🚨

  • 실패했던 자료와 사례를 모아둔 것 → 패턴, 아키텍쳐

📌 스프트웨어 디자인패턴 : 소프트웨어공학의 소프트웨어디자인 → 특정 문맥에서 공통적으로 발생하는 문제에 대해 재사용가능한 해결책

  • 소스나 기계코드로 바로 전환될 수 있는 완성된 디자인 ⛔️

  • 디자인패턴 → 프로그래머가 어플리케이션이나 시스템을 디자인할 때, 공통된 문제들을 해결하는데 형식화 된 가장 좋은 관행


1 복잡한문제 해결법 - 문제를 나누자

복잡한 문제를 아키텍쳐 적으로 해결하는 방법 → 문제를 나누는 방식이 가장 애용됨

  • 서버구조

    • New Data : 새로운 데이터를 처리하는 부분 → @Controller
    • Service Logic : 서비스 로직을 처리하는 부분 → @Service
    • Old Data : 기존의 데이터를 이용하는 부분 → @Repository
  • 각 부분 → 스프링, 스프링부트에서 각각의 레이어로 나누어져있음


2 레이어드 아키텍쳐 패턴

1️⃣ Presentation 계층

📌 Presentation 계층 : User와의 상호작용 처리계층

  • HTTP Request 처리 + HTML 랜더링 ⭐️

  • MVC Pattern (Model, View, Controller) → Presentation 계층 ⭐️

  • URL Mapping → 특정 메서드가 호출되도록 하는 것

📍 Spring Presentation 계층 → @Controller 어노테이션 사용

2️⃣ Domain(Business, Service) 계층

📌 Domain(Business, Service)계층 : 서비스 및 시스템의 핵심로직

  • Business 논리계층으로 유효성검사 및 계산

  • application이 수행해야하는 domain과 관련된 작업을 담당함

  • 입력 및 저장된 Data → 계산

  • Data access 종류 결정

  • 서버 프로그램 복잡성증가 → 비즈니스 로직 수행만을 위한 별도계층(Layer)필요
    ➡️ 프레임워크 사용으로 Presentation, Data Access 비중 줄이고 Domain 비중증가 ✅

📍 Spring Domain 계층 → @Service 어노테이션 사용

3️⃣ Data Access(Persistance) 계층

📌 Data Access(Persistance)계층 : Database, Message Queue, 외부 API와의 통신처리

  • DAO 계층

  • Database, 원격서비스 → 영구데이터 관리방법을 분류하는 데이터 접근계층

  • Data source, Database → 대부분 서버 외부에 별개로 존재 ⭐️
    ➡️ Data Access 계층은 데이터와의 소통을 담당함

📍 Spring Data Access(Persistance) 계층 → @Repository 어노테이션 사용

3 Code 예시 살펴보기

1️⃣ Presentation 계층(@Controller)

📍 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

    • 각 Layer 층은 본인과 인접한 Layer와 직접소통함
    • ContentService 객체 → Controller 단에서 Service단으로 새로 받아온 데이터를 전달하거나 Service 로직 호출가능
  • #3 : 특정 Request → 호출될 메서드를 지정해주는 어노테이션

  • #4 : @PathVariable → 자동으로 일치하는 변수값을 메서드호출 시점에 같이 넘겨줌

  • #5 : View까지 같이 반환하느냐, JSON 형식으로 데이터만 반환하느냐를 결정하는 어노테이션

2️⃣ Domain 계층(@Service)

📍 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 : 인접한 계층으로 데이터를 전달

3️⃣ Data Access 계층(@Repository)

📍 Data Access 계층
@Repository
public interface ContentRepository extends JpaRepository<Content, Long>{}

4 Spring, SpringBoot 사용이유

📌 Spring, SpringBoot

  • 단순 반복작업부분이 많았던 Controller와 Repository쪽을 개발관점에서 매우 쉽고 편하게 처리
  • 핵심 비즈니스로직 Service단에 더 집중할 수 있도록 해줌 ⭐️
profile
🐱Sunyeon-Jeong, mallang developer🐰

0개의 댓글