본문 바로가기

💻 개발IT/Spring

Spring(스프링) 실행 구조 (Controller, Service, Mapper, DAO, VO)

Spring 구조

클라이언트가 Controller를 호출하면

Controller → ServiceImpl → DAO (or Mapper) → SqlMapper 

를 통해 DB에 접근하게 된다.

이 과정 중에 사용되는 데이터 형식은 DTO / VO로 정의된다.

 

파일 구조를 보면 아래와 같다.

여기서는 DAO 대신 Mapper를 사용하였다.

 

이제 하나하나 살펴보자.

 

DTO (or VO)

DTO : Data Transfer Object (getter/setter)

VO : Value Object (getter만 존재)

각 layer에서 데이터를 주고 받을 때 사용하는 객체이다

 

[PostDTO.java]

package com.board.post.dto;

import lombok.Data;

@Data
public class PostDTO {
    private int idx;
    private String title;
    private Stirng body;
}

 

Controller

클라이언트(웹 브라우저)의 요청을 받아 해당하는 Service를 호출하여 요청을 처리한다.

 

[Postcontroller.java]

package com.board.post.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.http.ResponseEntity;
import org.springframework.http.HttpStatus;
import com.board.post.dto.*;
import java.util.List;

@RestController
@RequestMapping({ "/api/post" })
public class PostController {
    @Autowired
    private PostService postService;
    
    @GetMapping("/getPostList")
    public ResponseEntity<List<PostDTO>> getPostList() throws Exception {
    	List<PostDTO> result = this.postService.getPostList();
        return ResponseEntity.ok(result);
    }
    
    @PostMapping("/addPost")
    public ResponseEntity<Integer> addPost(@ApiParam(value="post", required=true) @RequestBody PostDTO post) {
    	int result = this.postService.addPost(post);
        return new ResponseEntity<>(post, HttpStatus.CREATED);
    }
}

@Controller

  • 이 클래스가 Controller class 임을 명시

 

@RequestMapping("~")

  • @Controller 선언된 클래스에서 사용 가능
  • @RequestMapping("/api/post") 인 경우 baseURL/api/post를 호출할 때 이 파일을 확인

 

 

Service

Controller가 요청을 받으면 적절한 Service와 연결해주고,

전달 받은 Service는 DB에 접근하는 DAO(or Mapper)를 이용하여 비즈니스 로직 수행한다.

 

Service는 interface와 구현 클래스 2 개의 파일을 구현해야 한다.

 

[PostService.java] - interface

package com.board.post.service;

import com.board.post.dto.PostDTO;
import java.util.List;

public interface PostService {
    List<PostDTO> selectPostList();
    Integer insertPost(PostDTO post);
}

[PostServiceImpl.java] - 구현 클래스

package com.board.post.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import com.board.post.dto.PostDTO;
import com.board.post.mapper.PostMapper;

@Service
public class PostServiceImple implements PostService {
    @Autowired
    private PostMapper postMapper;
    
    @Overrice
    public List<PostDTO> selectPostList() {
    	return this.postMapper.selectPostList();
    }
    
    @Override
    public Integer insertPost(PostDTO post) {
    	return this.postMapper.insertPost(post);
    }
}

@Service

: 이 클래스가 Service 클래스임을 명시

 

 

 

DAO (or Mapper)

비즈니스 로직 실행에 필요한 DB 쿼리를 호출하는 파트

DB의 효율적인 커넥션 관리를 위해 비즈니스 로직과 분리해둔 것이다.

 

DAO 대신 Mapper를 사용하기도 한다.

Mapper

Mybatis에서 Mapper 인터페이스를 제공하고,

이 mapper를 사용하면 일일이 DAO를 만들지 않고 인터페이스만을 이용해서 편하게 개발 가능

SQL문은 *.xml형식으로 저장되어 편리하게 관리할 수 있다. 

더보기

MyBatis

- Java에서 RDBMS를 쉽게 사용할 수 있도록 도와주는 프레임워크

 

[PostMapper.java]

package com.board.post.mapper;

import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import com.board.post.dto.*;

@Mapper 
public interface PostMapper {
    List<PostDTO> selectPostList();
    Integer insertPost(PostDTO post);
}

@Mapper

: 이 클래스가 Mapper 인터페이스임을 명시

 

SQLMapper

[post.xml]

<?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.board.post.mapper.PostMapper">
  <select id="selectPostList" resultType="com.board.post.dto.PostDto">
     	SELECT
     		idx,
     		title,
     		body
     	FROM
     		post
  </select>
  <insert id="insertPost" parameterType="com.board.post.dto.PostDto">
  	INSERT INTO post(
            	title,
            	body
        ) VALUES (
            	${title},
            	${body}
        )
  </insert>
</mapper>
  • namespace : Mapper의 전체 경로
  • id : Mapper interface의 method 이름과 xml 파일의 id 동일하게 작성
  • parameterType: 파라미터 타입
  • resultType: 결과값 반환 타입

 

반응형