API Server + React Project
프로젝트 목표 : API server 구현 및 이해 + react 구현 및 이해
프로젝트 github: https://github.com/ladianchad/spring_kotlin_api_study
MVC 패턴이란?
Model - View - Control의 약자로, web application을 구성 할 때 역할에 따라 책임 영역을 구분하여 개발하는 방식을 의미한다.
- Model : Data의 형태나 DB에 저장 하는 방법등 Data에 관련된 것들을 책임.
- View , Control에서 필요로 할 모든 data를 가지고 있어야 한다.
- View , Control의 작동 방식이나 원리에 대해 알지 말아야 한다.
- View: User에게 보여지는 화면을 구성하는 계층
- Data를 따로 저장하면 안된다.
- Control, Model의 작동 방식이나 원리를 몰라야 한다.
- Control: Data를 가공하는 Business logic이 들어있는 계층
- 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를 포스팅 한다.
'웹' 카테고리의 다른 글
Spring + Kotlin API Server 만들기 (6) : AWS EB + github action으로 CI/CD 구축 (0) | 2022.02.15 |
---|---|
Spring + Kotlin API Server 만들기 (4) : Service , TDD (0) | 2022.02.15 |
Spring + Kotlin API Server 만들기 (3) : Entity , Repository (0) | 2022.02.15 |
Spring + Kotlin API Server 만들기 (2) : project setting (0) | 2022.02.15 |
Spring + Kotlin 환경 세팅 (Ubuntu 20.04 + VScode) (2) | 2021.12.20 |