본문 바로가기

Spring + Kotlin API Server 만들기 (1) : 프로젝트 시작, MVC 패턴

API Server + React Project

프로젝트 목표 : API server 구현 및 이해 + react 구현 및 이해

프로젝트 github: https://github.com/ladianchad/spring_kotlin_api_study

 

GitHub - ladianchad/spring_kotlin_api_study

Contribute to ladianchad/spring_kotlin_api_study development by creating an account on GitHub.

github.com

MVC 패턴이란?

Model - View - Control의 약자로, web application을 구성 할 때 역할에 따라 책임 영역을 구분하여 개발하는 방식을 의미한다.

  • Model : Data의 형태나 DB에 저장 하는 방법등 Data에 관련된 것들을 책임.
  1. View , Control에서 필요로 할 모든 data를 가지고 있어야 한다.
  2. View , Control의 작동 방식이나 원리에 대해 알지 말아야 한다.
  • View: User에게 보여지는 화면을 구성하는 계층
  1. Data를 따로 저장하면 안된다.
  2. Control, Model의 작동 방식이나 원리를 몰라야 한다.
  • Control: Data를 가공하는 Business logic이 들어있는 계층
  1. Model , View의 존재를 모두 알고 중간에서 알맞게 데이터를 가공한다.

Spring Frame Work에서의 MVC

Spring은 MVC를 다음과 같이 계층 구조가 나뉘어 있다.

  • Model
    • Entity와 Repository라는 어노테이션(@)으로 확인 된다.
    • Entity는 Data의 구성을 담당한다.
    • Repository는 데이터의 저장 및 조회를 담당한다.

entity examlple

package com.studuy.study.device

import javax.persistence.*

@Entity
@Table(name = "devices")
class Device{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "device_id", nullable = false)
    var id: Long? = null

    @Column
    var value: String? = null

    @Column
    var command: String? = null
}

repository example

package com.studuy.study.device

import org.springframework.data.repository.CrudRepository
import org.springframework.stereotype.Repository

@Repository
interface DeviceRepository : CrudRepository<Device, Long>{
    
}

 

  •  Controller
    • Controller와 Service라는 어노테이션(@)으로 확인 된다.
    • Controller는 data의 validation(방어 로직) 및 적절한 Service를 찾아서 요청 처리를 위임한다.
    • Service는 data를 가지고 business logic을 실행한다.

controller example

package com.studuy.study.device

import org.springframework.http.MediaType
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController

@RestController
@RequestMapping(produces = [MediaType.APPLICATION_JSON_VALUE])
class DeviceContorller(
    private val deviceService: DeviceService
){
    @GetMapping("/v1/devices")
    fun getDevices(): Iterable<Device>{
        return deviceService.getAll()
    }

    @GetMapping("/v1/devices/{deviceId}")
    fun getDevice(@PathVariable("deviceId") deviceId: Long): Device{
        return deviceService.get(deviceId)
    }
}

service example

package com.studuy.study.device

import org.springframework.data.repository.findByIdOrNull
import org.springframework.stereotype.Service
import org.springframework.transaction.annotation.Transactional

@Service
@Transactional(readOnly = true)
class DeviceService(
    private val deviceRepository: DeviceRepository
) {
    fun getAll(): Iterable<Device>{
        return  deviceRepository.findAll();
    }

    fun get(deviceId: Long): Device{
        return deviceRepository.findByIdOrNull(deviceId) ?: throw RuntimeException("no device found!!")
    }
}

 

  • View
    • 이번 포스팅에선 mustache라는 라이브러리를 사용
    • main/resources/templates에 파일이 존재
    • controller에서 확장자를 제외하고 파일 이름을 string으로 return하면 templates folder에서 찾아서 리턴한다.

view example

<html>
<head>
    <title>{{title}}</title>
    <h1 style="width=100%; height=auto; margin=auto; align-items=center;">Spring Kotlin API를 공부하기 위한 사이트 입니다.</h1>
</head>
<body>
<h2>Entity</h2>
<p> - {{entity}}</p>
</body>
</html>

이상으로 MVC 패턴을 마치고 다음 포스팅에선 Entity와 Repository를 포스팅 한다.