02.03 SpringBoot 및 서버 이해

2023. 2. 3. 12:39개발일지

소프트웨어 디자인 패턴(Software Design Pattern)

소프트웨어 공학의 소프트웨어 디자인에서 특정 문맥에서 공통적으로 발생하는 문제에 대해 재사용 가능한 해결책입니다.

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


Presentation 계층

사용자와 상호 작용 처리 계층

CLI, HTTP 요청, HTML 처리 등을 담당합니다.

HTTP 요청 처리 및 HTML 렌더링에 대해 알고 있는 웹 계층

흔히 말하는 MVC (Model / View / Controller) 도 이 계층에 속합니다.

URL을 매핑해서 특정 메서드가 해당 URL로 요청이 올 때마다 호출되게 프로그래밍 했었습니다. 그 계층을 말하는 것이며, 스프링에서는 @Controller 어노테이션을 사용하여 표현합니다.

Domain(Business or Service) 계층

서비스 / 시스템의 핵심 로직

유효성 검사 및 계산을 포함하는 Business 논리 계층

애플리케이션이 수행해야하는 도메인과 관련된 작업들을 담당합니다.

입력 / 저장된 데이터를 기반으로 계산합니다.

Presentation 계층에서 받은 데이터의 유효성 (Validation) 검사

어떤 Data Access를 선택할지 결정

우리의 서버 프로그램이 복잡해지면, 비즈니스 로직을 수행하기 위한 별도의 계층(Layer)이 필요합니다.
사실 더 이상적으로는 유능한 서버 프레임워크를 써서 Presentaion, Data Access계층에는 별로 할 일이 없고, 도메인 계층이 비대해지는게 가장 좋습니다.
(스프링에서는 @Service 어노테이션을 사용해서 표현합니다.

Data Access(Persistence) 계층

DAO 계층

Database / Message Queue / 외부 API와의 통신 등 처리

데이터 베이스 또는 원격 서비스에서 영구 데이터를 관리하는 방법을 분류하는 데이터 접근 계층

우리의 데이터베이스, 혹은 데이터를 저장하는 데이터 소스는 서버 외부에 별개로 존재하는 경우가 매우 많고, 그러한 데이터 소스와의 소통을 해주는 계층이라고 생각하시면 될 것 같습니다.
(Spring에서는 @Repository 어노테이션을 사용해서 표현합니다.

서버를 레스토랑으로 비유한 예시


Controller, Service, Respository 실제 코드
Controller 예시 코드
@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") //5
    @ResponseBody// 6
    public Content createContent(@RequestBody ContentRequestDto requestDto) {
        Content content = contentService.createContent(requestDto);
        return content;
    }
}
  1. 이 자바 객체가 컨트롤러 역할을 하는 객체라는 것을 알려주는 어노테이션입니다!
             (@Controller)
  2. 각각의 레이어는 "일반적으로" 자기와 인접한 레이어와 직접 소통합니다, 이 경우 ContentService 객체를 가지고 있어, 컨트롤러 단에서 서비스 단으로 새로 받아온 데이터를 전달하거나 서비스 로직을 호출 할 수 있습니다.( ex : 2-1 )
    ( private final ContentService contentService )
    1. Content content = contentService.getcontent(requestDto);
  3. 플라스크의 @app.route("/")와 비슷해서 이미 짐작하셨겠지만, 특정 요청에 호출된 메서드를 지정해주는 어노테이션입니다
  4. 해당 메서드에 넘기는 인자값을 손쉽게 넘기도록 위와 같은 어노테이션을 사용 할 수 있습니다. 이러한 어노테이션이 있으면 자동으로 일치하는 변수값을 메서드 호출되는 시점에 같이 넘겨줍니다.
  5. '3', '5'가 다른 이유는 HttpMethod에 따라서 다른 Controller 메서드를 연결해줄 수 있기 때문입니다. 같은 주소로 온 GET 요청과  POST을 나눠서 각각 처리하기에 용이합니다.
  6. 위의 메서드와 아래의 메서드는 이전에 배웠던, 뷰까지 같이 반환하느냐, 혹은 JSON 형식으로 데이터만 반환하느냐의 차이가 있습니다.

Service 예시 코드
@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. 마찬가지로 이 자바 객체가 서비스 역할을 하는 객체라는 것을 알려주는 어노테이션입니다.
  2. 인접한 계층인 Repository 객체를 가지고 있어야 합니다.
  3. 사실 이 부분 역시 인접한 계층으로 데이터를 전달하는 중입니다.

Repository 예시코드
@Repository
public interface ContentRepository extends JpaRepository<Content, Long> {

}
  1. 마찬가지로 이 자바 객체가 서비스 역할을 하는 객체라는 것을 알려주는 어노테이션입니다.

'개발일지' 카테고리의 다른 글

02.04 HTTP, OSI, TCP/IP 특강 (TIL)  (0) 2023.02.04
02.03 Database 와 SQL  (0) 2023.02.03
02.03 웹 동작방식 이해하기  (0) 2023.02.03
02.02 시험 풀이  (0) 2023.02.02
02.02 시험  (0) 2023.02.02