KoreaIt Academy/Spring Boot

[Spring Boot] 3-tier(티어) 아키텍처

hongeeii 2021. 10. 8.
728x90
반응형

3-tier Architecture

스프링 프로젝트는 3-tier(티어)방식으로 구성합니다.

[Presentation Tier(화면 계층)]  

화면에 보여주는 기술을 사용하는 영역.
컨트롤러에서 사용자의 요청에 맞는 응답처리를 진행하며,
HTML엔진(thymeleaf), HTML등이 담당하는 영역입니다.

Spring MVC 객체를 말합니다.

프론트 컨트롤러(DispatcherServlet), 컨트롤러, 뷰, 모델이 포함됩니다. 

 

//  프리젠테이션 계층의 구현
//  Task         URL                Method         Parameter       Form         URL 이동
//  전체 목록   /board/list            GET              없음         없음           없음
//  등록 처리   /board/register       POST             모든 항목      필요           이동
//  조회 처리   /board/remove          GET             bno           필요           없음
//  삭제 처리   /board/remove          POST            bno           필요           이동
//  수정 처리   /board/modify          POST            모든 항목       필요           이동

@Controller
@Slf4j
@RequestMapping("/board/*")
@RequiredArgsConstructor
public class BoardController {

//    서비스를 구현한 클래스가 여러개라면
//    @Autowired
//    @Qualifier("구현된 서비스 빈 이름")
//    private BoardService boardService;

    private final BoardService boardService;

    @GetMapping("list")
    public String list(Model model){
        log.info("-----------------------------");
        log.info("list");
        log.info("-----------------------------");
        model.addAttribute("list",boardService.getList());
        return "board/list";
    }

}


 

[Business Tier(비지니스 계층)] 

순수한 비지니스 로직을 담고 있는 영역.
고객이 원하는 요구사항을 반영하는 계층이기 때문에 중요한 영역입니다.
이 영역의 설계는 고객의 요구사항과 정확히 일치해야 하며, 서비스 영역입니다.


프레젠테이션 계층(View)와 영속 계층(DBMS)의 중간다리 역할을 합니다.
영속 계층은 DBMS를 기준으로, 비지니스 계층은 로직을 기준으로 처리합니다.
예를 들어 쇼핑몰에서 상품을 구매 시 포인트 적립을 한다고 가정한다면,
영속 계층의 설계는 '상품', '회원'으로 나누어 설계하지만 비지니스 계층은
상품 영역과 회원 영역을 동시에 사용해서 하나의 로직을 처리하게 됩니다.

일반적으로 비지니스 영역에 있는 객체들은 서비스(Service)라는 용어를 많이 사용합니다.

 

xxxService, xxxServiceImpl

비지니스 영역을 담당하는 인터페이스는 xxxService,

인터페이스를 구현한 클래스는 xxxServiceImple 라는 이름을 사용합니다.

 

* Service 

- Controller에 의해 호출되어 실제 비즈니스 로직과 트랜잭션을 처리합니다.

- dao를 호출하여 DB CRUD를 처리 후 Controller로 반환합니다.
* */
// 서비스를 설계할 때, 여러 클래스에 동일한 기능을 구현한다면, 인터페이스로 선언 후 지정하여 개발합니다.
// 하지만 여러 클래스에 동일한 인터페이스를 지정한다면,

// 인터페이스로 의존성 주입 요청 시 어떤 클래스로 주입할 지  Spring은 알 수 없습니다.
// 따라서 주입 요청 시 등록되어 있는 빈의 이름을 설정하여 원하는 클래스로 주입을 받게됩니다.

// Mapper 인터페이스는 xml의 쿼리 결과로 자동 주입 되기 때문에 Service에 있는 인터페이스와 성격과 목적이 다릅니다.

 

// 컨트롤러에서 서비스를 구현한 클래스가 여러개라면 

@Autowired
@Qualifier("구현된 서비스 빈 이름")
private BoardService boardService;

 

[Persistence Tier(영속 계층 혹은 데이터 계층)] 

데이터를 어떤 방식으로 보관하고, 사용하는 가에 대한 설계가 들어가는 계층.
일반적으로 DBMS를 많이 사용하지만, 상황에 따라서 네트워크 호출 또는 원격 호출 등의 기술이 접목될 수 있습니다.

데이터의 CRUD 연산을 수행하는 Mapper와 결과를 객체로 리턴하는 DAO까지 영속 계층에 속합니다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.example.board.mappers.BoardMapper">
    <!--    게시글 목록 가져오기-->
    <select id="getList" resultType="boardVO">
        <![CDATA[
        SELECT * FROM TBL_BOARD WHERE BNO > 0
        ]]>
    </select>

    <!--    게시글 작성
            작업은 완료되지만 현재 추가된 데이터의 PK값은 알 수 없다.-->
    <insert id="insert">
        INSERT INTO TBL_BOARD (BNO, TITLE, CONTENT, WRITER)
        VALUES (SEQ_BOARD.NEXTVAL, #{title}, #{content}, #{writer})
    </insert>

    <!--    PK값을 미리 SQL을 통해서 처리해 두고 지정한 이름으로 결과를 보관하는 방식이다.
            SQL을 한번 더 실행하는 부담이 있기는 하지만 자동으로 추가되는 PK값을 확인해야 하는 상황에서는
            유용하게 사용될 수 있다.-->
    <insert id="insertSelectKey_bno">
        /* 태그 안에서는 이와 같은 주석으로 사용해야 한다. */
        /* 게시글 등록 전 다음 시퀀스를 가져와서 insertSelectKey_bno 메소드의 매개변수로 매핑후 전달한다. */
        <selectKey keyProperty="bno" order="BEFORE" resultType="long">
            SELECT SEQ_BOARD.NEXTVAL FROM DUAL
        </selectKey>
        /* 위에서 전달받은 bno를 사용한다. */
        INSERT INTO TBL_BOARD (BNO, TITLE, CONTENT, WRITER)
        VALUES (#{bno}, #{title}, #{content}, #{writer})
    </insert>

    <!--    게시글 상세보기(특정 게시글 정보)-->
    <select id="read" resultType="boardVO">
        SELECT * FROM TBL_BOARD WHERE BNO = #{bno}
    </select>

    <!--    게시글 수정-->
    <update id="update">
        UPDATE TBL_BOARD SET TITLE = #{title}, CONTENT = #{content}, UPDATEDATE = SYSDATE
        WHERE BNO = #{bno}
    </update>

    <!--    게시글 삭제-->
    <delete id="delete">
        DELETE FROM TBL_BOARD WHERE BNO = #{bno}
    </delete>
</mapper>


-------------------------------------------------------------------------------------------------------------------------------

각 영역은 독립적으로 설계되어 나중에 특정한 기술이 변하더라도 필요한 부분을 전자제품의 부품처럼
쉽게 교환할 수 있게 하자는 방식입니다.

각 연결 부위는 인터페이스를 이용해서 설계하는 것이 일반적인 구성 방식입니다.

--------------------------------------------------------------------------------------------------------------------------------





-----------------------------------------------------------------------------------------------------------------------------


728x90
반응형

추천 글