SpringBoot 및 서버 이해

박영준·2022년 11월 28일
0

Java

목록 보기
8/111

소프트웨어 디자인 패턴(software design pattern)

  • 소프트웨어 공학의 소프트웨어 디자인에서 특정 문맥에서 공통적으로 발생하는 문제에 대해 재사용 가능한 해결책
  • 소스나 기계 코드로 바로 전환될수 있는 완성된 디자인은 X
  • 다른 상황에 맞게 사용될 수 있는 문제들을 해결하는데에 쓰이는 서술이나 템플릿

복잡한 문제를 해결하는 방법 - 문제를 나누자!

서버는 “새로운 데이터를 처리하는 부분”, “서비스 로직을 처리하는 부분”, “기존의 데이터를 이용하는 부분” 으로 되어 있습니다.

레이어드 아키텍처 패턴

Presentation 계층

  • 사용자와 상호 작용 처리 계층
  • CLI, HTTP 요청, HTML 처리 등을 담당
  • HTTP 요청 처리 및 HTML 렌더링에 대해 알고 있는 웹 계층
  • MVC (Model / View / Controller) 도 이 계층에 속한다.
  • 스프링에서는 @Controller 어노테이션을 사용하여 표현
    (URL을 매핑해서 특정 메서드가 해당 URL로 요청이 올 때마다 호출되게 프로그래밍한 부분)

Domain(Business or Service) 계층

  • 서비스/시스템의 핵심 로직
  • 유효성 검사 및 계산을 포함하는 Business 논리 계층
  • 애플리케이션이 수행해야하는 도메인과 관련된 작업들을 담당
  • 입력/저장된 데이터를 기반으로 계산
  • Presentation 계층에서 받은 데이터의 유효성 (Validation) 검사
  • 어떤 Data Access 를 선택할지 결정
  • 스프링에서는 @Service 어노테이션을 사용해서 표현
  • Domain 계층 필요 이유? 서버 프로그램이 복잡해지면, 비즈니스 로직을 수행하기 위한 별도의 계층(Layer)이 필요

Data Access(Persistence) 계층

  • DAO 계층
  • Database / Message Queue / 외부 API와의 통신 등 처리
  • 데이터베이스 또는 원격 서비스에서 영구 데이터를 관리하는 방법을 분류하는 데이터 접근 계층
  • 스프링에서는 @Repository 어노테이션을 사용해서 표현
  • 데이터베이스, 혹은 데이터를 저장하는 데이터 소스는 서버 외부에 별개로 존재하는 경우가 매우 많고, 그러한 데이터 소스와의 소통을 해주는 계층

서버의 각각의 계층과 스프링에서 어노테이션의 역할


Controller 예시 코드

@Controller //이 자바 객체가 컨트롤러 역할을 하는 객체라는 것을 알려주는 어노테이션 
public class ContentController {
	//(일반적으로)각각의 레이어는 자기와 인접한 레이어와 직접 소통
    //이 경우 ContentService객체를 가지고 있어, 컨트롤러 단에서 서비스 단으로 새로 받아온 데이터를 전달 or 서비스 로직을 호출 가능
    //예를들어 #2-1 처럼
    private final ContentService contentService; 

		@GetMapping("/content/{contentId}") //특정 요청에 호출될 메서드를 지정해주는 어노테이션 (flask의 @app.route(”/”)와 비슷)
		public Content getContent(@PathVariable Long contentId) { //해당 메서드에 넘기는 인자값을 손쉽게 넘기도록 함 --> 이 어노테이션이 있으면, 자동으로 일치하는 변수값을 메서드 호출되는 시점에 같이 넘겨줌(JVM 같은???) 
        Content content = contentService.getContent(requestDto); //#2-1
        return "/contentPage";
    }

	//위의 어노테이션(@GetMapping("/content/{contentId}"))과 다른 이유?
    	//HttpMethod에 따라서 다른 Controller 메서드를 연결해줄 수 있기 때문 --> 같은 주소로 온 GET 요청과 POST을 나눠서 각각 처리하기에 용이
    @PostMapping("/content") 
		@ResponseBody//@PostMapping("/content")와의 차이?  뷰까지 같이 반환하느냐, 혹은 JSON 형식으로 데이터만 반환하느냐의 차이
    public Content createContent(@RequestBody ContentRequestDto requestDto) {
        Content content = contentService.createContent(requestDto);
        return content;
    }
}

Service 예시 코드

@Service //이 자바 객체가 서비스 역할을 하는 객체라는 것을 알려주는 어노테이션
public class ContentService {
    private final ContentRepository contentRepository; //인접한 계층인 Repository 객체를 가짐

    public ReturnDto getContent(Long id) {
        ReturnDto returnDto = contentRepository.findById(id);
        return returnDto; //인접한 계층으로 데이터를 전달
    }
	
    public Content createContent(ContentRequestDto contentRequestDto) {
		    Content content = new Content(contentRequestDto);
		    contentRepository.save(content);
		    return content;
		}

}

Repository 예시 코드

@Repository	//이 자바 객체가 서비스 역할을 하는 객체라는 것을 알려주는 어노테이션
public interface ContentRepository extends JpaRepository<Content, Long> {	//우리가 직접 사용하게 될 부분!!

}

참고: JpaRepository


스프링/스프링부트를 사용하는 이유?

단순 반복작업부분이 많았던 Controller와 Repository쪽을 개발 관점에서 매우 쉽고 편하게 처리해줘, 가장 중요한 핵심 비즈니스 로직인 Service 레이어에 더 집중 할 수 있도록 하게 해준다.


용어

  • 어노테이션(Annotation): 주석이라는 의미. 자바 소스 코드에 사이에 @ 기호를 앞에 붙여서 사용

참고

소프트웨어 아키텍처 패턴: https://www.oreilly.com/library/view/software-architecture-patterns/9781491971437/ch01.html
레이어드 아키텍처 패턴: https://jojoldu.tistory.com/603

profile
개발자로 거듭나기!

0개의 댓글