본문 바로가기

Study/Spring & Spring Boot

[Spring Boot] DTO, DAO, Service, Controller

DTO


개요

DTO는 Data Transfer Object의 약자로 계층간 데이터 교환을 위해 사용하는 객체이다.

DTO 내부에는 로직이 존재하지 않으며, 생성자와 getter, setter만 존재해야 한다.

DTO 예시

import lombok.Getter;

@Getter
public class MemberDto {

    private String id;
    private String pwd;
    private String name;
    private String email;
    private int auth;

    public MemberDto() {
    }

    public MemberDto(String id, String pwd, String name, String email, int auth) {
        this.id = id;
        this.pwd = pwd;
        this.name = name;
        this.email = email;
        this.auth = auth;
    }

}

Lombok을 pom.xml에 추가했기 때문에 Getter 어노테이션을 추가하여 따로 getter를 생성해주지 않아도 된다.
setter는 어노테이션을 사용하지 않고 필요한 것만 별도로 선언해서 사용해야 한다.

DAO


개요

DAO는 Data Access Object의 약자로 데이터베이스에 접근하기 위한 로직과 비지니스 로직을 분리하기 위해 사용한다.

DAO 예시

import com.example.sample02.dto.MemberDto;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;

import java.util.List;

@Mapper
@Repository
public interface MemberDao {

    // mapper.xml의 id와 함수명이 일치해야함.
    List<MemberDto> allMember();
    void addMember(MemberDto dto);
}

스프링 프레임워크에서는 DAO를 인터페이스와 그것을 상속받는 클래스 모두 구현해주었지만 스프링 부트에서는 인터페이스만 작성한다. 이 때 mapper.xml 즉 마이바티스를 사용하기 위해 작성한 mapper 태그의 아이디와 같아야한다.

<?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.sample02.dao.MemberDao">
    <select id="allMember" resultType="com.example.sample02.dto.MemberDto">
        SELECT * FROM mysql.MEMBERS
    </select>

    <insert id="addMember" parameterType="com.example.sample02.dto.MemberDto">
        insert into mysql.MEMBERS(USER_ID, USER_PWD, USER_NAME, USER_EMAIL, AUTH)
        values (#{id}, #{pwd}, #{name}, #{email}, #{auth})
    </insert>
</mapper>

여기에는 MapperRepository 어노테이션이 붙는다..

@Mapper<mapper />를 찾아주고 클래스 내부 함수 이름으로 namespace를 찾아 쿼리문을 실행시킨 데이터를 가져오게 된다.

Service


개요

Service는 DAO에서 받아온 데이터를 가공해주는 곳이다.

Service 예시

import com.example.sample02.dao.MemberDao;
import com.example.sample02.dto.MemberDto;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
@Transactional
@RequiredArgsConstructor
public class MemberService {

    private final MemberDao dao;

    public List<MemberDto> allMember() {
        return dao.allMember();
    }

    public void addMember(MemberDto dto) {
        dao.addMember(dto);
    }

}

@RequiredArgsConstructor는 생성자를 만들어주는 어노테이션이다. 생성자로 만들 변수는 final로 선언되어야 한다.

@Service@Transational이 붙는다.

Controller


개요

Controller는 사용자가 웹 브라우저에 URI로 요청을 보낼 때 그 요청을 받아 응답을 반환하기 위해 사용하는 것이다.

Controller 예시

import com.example.sample02.dto.MemberDto;
import com.example.sample02.service.MemberService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@Slf4j
@RestController
@RequiredArgsConstructor
public class Controller {

    private final MemberService service;
    public Logger logger = LoggerFactory.getLogger(Controller.class);

    @GetMapping("/base")
    public String base() {
        logger.info("Hello World!");
        return "base";
    }

    @GetMapping("/dbTest")
    public List<MemberDto> dbTest() {
        logger.info("Controller getMember()");
        return service.allMember();
    }

    @GetMapping("/addMember")
    public void addMember(MemberDto dto) {
        logger.info("Controller addMember()");
        service.addMember(dto);
        System.out.println("추가됨");
    }

}

스프링 부트는 RESTful API로 정보를 송수신하기 때문에 @RestController를 달아준다.