Kotlin + Ktor + React 프로젝트를 Java + Spring + React 프로젝트로(1 - 구조)
동계 방학 중 현장실습을 하며 짬짬히 본인의 주식 포트폴리오를 구성하면, 보유한 주식들과 관련한 뉴스 정보들을 불러와주는 서비스를 간단하게 만들어봤다._(https://github.com/Mseunghwan/Ktor) 실습 기업에서 사용하던 Kotlin + Ktor 연습용으로 만든 프로젝트였는데, Java + Spring으로 그대로 카피한 프로젝트를 만들수 있을까? 하고 도전해보는 과정을 글로 작성한다.
여담으로, 주식 정보(이름, 가격, 시장 등)들을 가져오는 API는 처음엔 AlphaVantage를 활용하려 했으나 하루 호출량에 제한이 있어, FinanceDateReader(https://github.com/FinanceData/FinanceDataReader)를 활용했다. 제공해주신 개발자님께 감사함을 전한다. 적은 용량이라 그냥 DB에 저장하고 불러오기만 하면 계속 호출해야하는 AlphaVantage를 대체할 수 있기 때문.
관련 뉴스를 불러오는 API는 딥서치(https://news.deepsearch.com/) API를 활용했다
자, 먼저 Spring화 하기 전 구조가 어떤지 살펴봐야겠지.
===============================================================
kotlin/api/AlphaVantageClient.kt // 안쓴다 무시해도 된다
kotlin/com/example/data/models/post.kt // 게시판 관련 데이터 model 정의
kotlin/com/example/data/models/stock.kt // 주식 관련 데이터 model 정의
kotlin/com/example/data/DatabaseFactory.kt // DB 연결설정(HikariCP), 테이블 생성 및 트랜잭션 관리
kotlin/com/example/reporitories/NewsRepository.kt // 뉴스 호출과 관련된 함수정의
kotlin/com/example/reporitories/PostRepository.kt // 게시판 동작 인터페이스(CRUD)
kotlin/com/example/reporitories/PostRepositoryImpl.kt // 게시판 동작 인터페이스 정의
kotlin/com/example/reporitories/StockRepository.kt // 주식 검색 & 가격 호출 정의
kotlin/com/example/routes/NewsRoutes.kt // 뉴스 관련 클라이언트 요청 처리(HTTP)
kotlin/com/example/routes/PostRoutes.kt // 게시판 관련 클라이언트 요청 처리(HTTP)
kotlin/com/example/routes/StockRoutes.kt // 주식 관련 클라이언트 요청 처리(HTTP)
kotlin/com/example/Application.kt // Ktor 애플리케이션 진입점, 서버설정, 데이터베이스 초기화, API라우팅, 정적 파일 서빙 포함한 전체적 서버 구성
BackEnd
===============================================================
resources/webapp/frontend/src/components/ui/card.jsx // UI 카드 컴포넌트 정의
resources/webapp/frontend/src/components/NewsDashboard.jsx // 뉴스 대시보드 구성 컴포넌트
resources/webapp/frontend/src/components/PortfolioDashboard.jsx // 주식 포트폴리오 대시보드 컴포넌트
resources/webapp/frontend/src/components/PortfolioSection.jsx // 주식 포트폴리오 개별 섹션 컴포넌트
resources/webapp/frontend/src/components/PostList.jsx // 게시판의 게시글 리스트 컴포넌트
resources/webapp/frontend/src/components/PostModal.jsx // 게시글 작성 & 수정 위한 모달 컴포넌트
resources/webapp/frontend/src/styles/style.css
resources/webapp/frontend/src/App.css
resources/webapp/frontend/src/App.jsx // React 애플리케이션의 메인 엔트리 컴포넌트
resources/webapp/frontend/src/index.css
resources/webapp/frontend/src/main.jsx // React 애플리케이션 진입점
resources/webapp/frontend/.gitignore
resources/webapp/frontend/eslint.config.js
resources/webapp/frontend/index.html // React 애플리케이션의 메인 HTML
resources/webapp/frontend/package.json
resources/webapp/frontend/package-lock.json
resources/webapp/frontend/README.md
resources/webapp/frontend/vite.config.js
resources/webapp/package-lock.json
resources/application.conf
resources/application.yaml
FrontEnd
===============================================================
.gitignore
build.gradle.kts
gradle.properties
gradlew
gradlew.bat
settings.gradle.kts
Common Ground
===============================================================
이런식으로 보면 편하려나. 구조를 표현하기 좋게 시각화 해달라고 GPT한테 졸랐더니 정말 이상하게 해줘서 그냥 텍스트로 기재하겠다.
Ktor 프로젝트에서 백엔드를 model, repository, routes로 나눠 구성하는 이유는 소프트웨어 개발에서 흔히 사용하는 레이어드 아키텍쳐 혹은 MVC 패턴을 따랐다고 볼 수 있다.
즉 Routes에서는 HTTP 요청을 처리하고(Presentation Layer), Repository는 데이터 저장 및 조회(Data Access Layer), Model은 데이터를 정의하는 부분이다(Entity Layer). 비슷한 패턴으로 MVC도 있는데 MVC는 모델, 뷰, 컨트롤러로 Ktor 기반에서는 view레이어를 제외한 백엔드 중심구조로 구현되었다.
이러한 패턴을 따르는 이유?
가장 큰 이유는 코드의 구조화와 유지보수성을 위해이다. 대부분 이러한 패턴을 따름으로써 프로젝트의 구조를 간편하게 만들고 협업을 용이하게 한다. 이러한 구조를 토대로 코드를 쌓다보면 그만큼 타 프로젝트에 대한 이해의 가능성도 높아지는 것(? 말이 좀 이상한데_
이러한 Ktor를 Spring으로 어떻게 바꿀 수 있을까. Kotlin과 Java가 호환성이 그렇게 좋다는데, 별 어려움 없이 할 수 있을지 다음 글에서 이어 작성하겠다