목표
우선 kotlin 학습 조금 해주고 프로젝트 구조를 잡아보자!
Kotlin이란?
코틀린은 안정성, 간결성, 상호운용성을 강조하는 다중 패러다임, 다중 플랫폼 프로그래밍 언어이다.
2010년 하반기에 생겨서 2016년 2월 처음으로 릴리즈됐으며,
안드로이드 개발, 데스크톱 어플리케이션, 백단 서버 개발 등 여러 개발분야에서 인기를 얻고 있다.
2017년 구글은 안드로이드 플랫폼의 공식 지원언어로 코틀린을 선택했다.
2019년 11월 코틀린 1.3이 나옴
2021년 5월 1.5.0이 나옴
......
2025년 5월 13일 2.1.21이 나옴
2010년 당시 Scala나 C# 등의 언어에서 사용할 수 있었던 유용한 기능이 자바에는 없었음.→ Jetbrains는 당시 사용 가능한 JVM언어를 검토 및 자원을 투입
→ 새로운 언어를 만들기로 함. → 개발 팀원의 상당수가 러시아 상트페테르부르크 근처의 섬인 "코틀린"에 위치하고 있어서 그 이름을 붙였음.
커뮤티티 : https://kotlin.link/
Korean Kotlin User Group : http://kotlin.kr/
Kotlin Playgraound : 코틀린 놀이터
kotlin 문법은 자바랑 정말 비슷하지만 다른부분이 있으니 다른부분만 캐치해서 보면 좋을것 같다.
또한 스칼라처럼 함수형 프로그래밍이 가능하니 이부분 또한 참고하면 좋을것 같다.
간단한 프로젝트를 만들어서 따라하기 좋은 유튜브를 찾아서 따라 해보았다.
- Building a Full Stack Web Application with Kotlin and React - Part 1/2 - Backend + Frontend - link
결과적으로 Kotlin JS와 Backend를 함께 사용하여 만들수 있습니다.
운영툴이나 개인프로젝트를 개발하다 보면, 종종 이렇게 묻게 됩니다.
"프론트엔드와 백엔드를 굳이 따로 나눠야 할까?”
결론적으로 프론트 + 백엔드를 하나로 묶는 Monolith 구조로 개발하게 되었습니다.
Backend HelloWorld 찍기!
다시 돌아와 우선 학습부터 진행 합니다.
먼저 코프링을 셋팅 해보겠습니다.
IntelliJ에서 SpringBoot기반 Kontlin 프로젝트를 만들어 줍니다.
SpringBoot기반이므로 web사용과 DB사용을 위해 JPA를 선택 해 줍니다.
또한 JPA관련 H2도 선택해 줍니다.
java 24 → 21로 변경해야 합니다.
project structure
컨트롤러를 하나 만들어서 테스트 해봅니다.
package com.kakao.www.strawdeliveryv2.controller
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
@RestController
@RequestMapping("/api")
class HelloController {
@GetMapping("/hello")
fun sayHello(): String {
return "Hello, Teri.Enjoy, Passion, Interesting!"
}
}
실행 - gradle bootRun
결과 - 아래처럼 헬로우월드 성공!
여기까지가 초~간단 web kotlin을 해보았습니다.
이제 본격적으로
왜 Monolith인가?
를 알아보고 구조를 나눠보겠습니다.
- backend : kotlin backend 소스
- frontend : react admin css framework 소스
1) 사용자가 소수이며, 오픈 대상은 내부인 운영툴 개발
대국민 서비스가 아니라 내부 운영툴입니다.
복잡한 MSA 구조보다 단일 프로세스로 관리하는 편이 빠르고 안정적입니다:)
2) CI&CD가 편하다!
하나의 jar 또는 도커 이미지로 배포할 수 있으니,
빌드, 테스트, 배포가 모두 단순해지고 파이프라인 관리도 깔끔합니다!
3) 유지보수의 이점
프론트와 백단이 동일 리포지토리에서 함께 버전 관리되므로,
기능 연동 및 테스트 시 오히려 생산성이 높아질 수 있습니다.
결론적으로 이번에 자프링 대신 코프링을 선택한 것은!!!
Kotlin을 배워볼 기회로 삼기에 딱 좋은 프로젝트 입니다. 개꿀~!
이제 본격적으로 구조를 나눠보겠습니다.
backend와 frontend 디렉토리를 만들어서 나눴습니다.
backend는 기존 헬로우 월드 소스를 넣어줬고
frontend는 저번 운영툴 만들 때 사용했던 css framework 소스를 넣어줬습니다.
Frontend Home 띄워보기!
backend는 Hello World를 찍어보았고
frontend는 Home을 띄워보겠습니다.
cd ~/straw-delivery-v2/frontend 로 이동해서
npm run dev 명령어를 수행 합니다.
result - 5173 port로 서빙합니다.
Monolith화 하기(Back+Front 동시에!)
우선적으로 front의 내용을 빌드해줍니다.
npm run build를 통해 dist 가 나오면 아래와 같이 cp를 해줍니다.
아래와같이 dist의 내용이 static으로 옮깁니다.
매번 수동으로 하기 힘드니 아래의 내용을 build.gradle.kts에 넣어줍니다.
tasks.register<Copy>("copyFrontend") {
from("frontend/dist")
into("backend/src/main/resources/static")
}
tasks.named("processResources") {
dependsOn("copyFrontend")
}
이제 백엔드로 가서 bootJar를 해줍니다.
cd /Users/teri.epi/DataPlatform/straw-delivery-v2
./gradlew bootJar
메인클래스를 못찾아서 오류가 나면 아래의 내용을 build.gradle.kts에 추가 합니다.
tasks.withType<org.springframework.boot.gradle.tasks.bundling.BootJar> {
mainClass.set("com/kakao/www/strawdeliveryv2/StrawDeliveryV2Application.kt")
}
결과로 build > libs아래에 jar가 생성 됩니다.
생성된 jar를 아래와 같이 실행시킵니다.
java -jar build/libs/straw-delivery-v2-0.0.1-SNAPSHOT.jar
현재 inteliJ에서는 jdk 21을 사용하고 있는데 로컬에서는 자바 8을 사용하고 있음.
jenv가 있는지 확인 후
해당 프로젝트에만 java 21을 적용 합니다.
jenv에 등록이 안돼있으면 등록(add)을 한 뒤에 jenv local 21을 통해 버전을 연결 합니다.
다시 java -jar build/libs/straw-delivery-v2-0.0.1-SNAPSHOT.jar 를 시도!
java -jar build/libs/straw-delivery-v2-0.0.1-SNAPSHOT.jar
Exception in thread "main" java.lang.ClassNotFoundException: com/kakao/www/strawdeliveryv2/StrawDeliveryV2Application.kt
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:534)
at java.base/java.lang.Class.forName(Class.java:513)
at org.springframework.boot.loader.launch.Launcher.launch(Launcher.java:99)
at org.springframework.boot.loader.launch.Launcher.launch(Launcher.java:64)
at org.springframework.boot.loader.launch.JarLauncher.main(JarLauncher.java:40)
만들 때 문제 있을것 같은데? 라고 생각하고 있었는데 역시나 에러가 뿜뿜!
backend 디렉토리를 만들어줬기 때문에 아래처럼 sourceSets를 해줍니다.
sourceSets {
main {
java {
setSrcDirs(listOf("backend/src/main/kotlin"))
}
resources {
setSrcDirs(listOf("backend/src/main/resources"))
}
}
}
tasks.withType<org.springframework.boot.gradle.tasks.bundling.BootJar> {
mainClass.set("com.kakao.www.strawdeliveryv2.StrawDeliveryV2ApplicationKt")
}
다시 수행하면 아래와 같이 잘 뜨는걸 확인할 수 있습니다.
이제 프론트와 백엔드 모두 한번에 8080포트로 서빙 되었습니다.
프론트
백단
이제 여러가지 해야할 것들을 잡아서 연구하고 붙이면 된다!
뭐부터 해볼까나~
이상 프론트엔드(React)와 백엔드(Kotlin)를 함께 배포하는 Monolith 구조 도전기_01
끝!