[Groupware] Spring-Boot : 테스트 코드
·
Project/Backend
📝 개요이번 프로젝트는 Spirng Boot 기반의 REST API 서버를 구축하고 기본을 익히는 과정이다. 초반에는 각 도메인에 대한 CRUD 를 개발하고 기능을 추가하는데 집중했지만, 점점 기능이 많아지고 API 요청/ 응답 케이스가 다양해지면서, 직접 서버를 띄워 일일이 Postman 으로 요청을 날리는 방식으로는 한계를 느꼈다. API 마다 다양한 예외 상황과 비즈니스 로직을 수동으로 검증하다보니 작업 속도도 느려지고, 코드 수정 시 기존 기능이 깨지는 경우도 있었다. 그래서 REST API 서버를 구축하면서 테스트 코드라는 것을 알게 되었고, 이를 적용하여 개발 속도를 높이고 각 예외에 대해서 더 견고하게 확인하고 설계하기 위해 도입했다. 다음은 프로젝트에 적용된 Spirng Boot 기반의 ..
[DataBase] Oracle + MyBatis SQL
·
Project/Database
📝 개요Spring Boot + MyBatis + Oracle DB 로 프로젝트를 진행하면서 Oracle 의 쿼리 문법은 기본적으로 좀 더 엄격하거나, 특이한 부분이 많다고 느겼다. MySQL 에서는 당연하게 되었던 것들이 Oracle 로 변경되면서 새롭게 알아가는 것도 있었고, 새로운 문법을 익혀야 하는것도 있었다. 다음은 Groupware 백엔드를 구현하면서 알아보았던 Oracle DB 의 SQL 문법과 MyBatis 에서 Oracle 을 사용했을 때의 특징과 사용에 대해서 설명한다.🚀 Oracle vs MySQL1️⃣ 시퀀스(Sequence) vs AUTO_INCREMENTMySQLPK 자동 증가 컬럼이 테이블에 존재한다.INSERT 시 값 입력을 따로 하지 않으면 AUTO_INCREMENT 설..
[Groupware] Database : Oacle DB 세팅
·
Project/Database
📝 개요Oracle Database(오라클 DB)는 세계적으로 많이 사용되는 상용 관계형 데이터 베이스 시스템 중 하나이다. 강력한 안정성, 보안, 대규모 데이터 처리에 최적화 된 아키텍처 덕분에 금융, 공공, 대기업 등 다양한 실무 현장에서 표준처럼 사용한다. Oracle Database 를 선택한 이유는 회사 및 고객 사이트에서 Oracle DB 를 사용하고 있고 그룹웨어 프로젝트 또한 사내 그룹웨어를 모방한 프로젝트이기 때문에 동일한 환경을 구축하기 위해 사용했다. 개인 프로젝트에서는 오픈소스 DB인 MySQL 과 MariaDB를 사용하면서 MyBaits 와의 연동을 통해서 구축했던 경험이 있지만, 오라클 특유의 구조와 쿼리 최적화, PDB 등 최신 기능을 학습하기 위해 Oracle DB 를 선택..
[Groupware] Spring Security + Exception
·
Project/Backend
📝 개요Groupware 프로젝트를 진행하면서 가장 고민을 많이 했던 부분 중 하나가 바로 예외처리를 하는 부분이다. 비즈니스 로직을 개발하다 보면 런타임 예외를 던져야 할 상황이 자주 발생하는데, REST API 환경에서는 “예외를 어떻게 공통적이고 일관된 방식으로 처리할 것인가?” 라는 생각을 하게 되었다. 그래서 고민 끝에, 모든 비즈니스 예외를 RuntimeException 기반의 CustomException 으로 통일하고, 예외별 상태코드와 메세지는 Enum(ErrorCode)에 한곳에 정의했다. 그리고 이 예외를 GlobalExceptionHandler 를 통해 전역적으로 한번에 처리하는 구조를 선택했다. 이렇게 설계하니 예외 처리 코드가 중복 없이 재사용성도 높아지고, ErrorCode 를..
[Groupware] Spring-Boot : Spring Security + JWT
·
Project/Backend
📝 개요Groupware 프로젝트는 Spring-Boot 백엔드 API 서버 구축과 React 프론트엔드 서버 구축 및 연동 학습에 중점을 둔 프로젝트이다. 이전 YBoard (게시판) 프로젝트에서 Spring Security 를 이용하여 보안 부분에 대한 프레임 워크를 사용했었는데, REST API 구조에서의 Spring Security 활용에 대해서 학습하기 위해서 보안 및 인증에 대한 라이브러리로 선택하게 되었다. 이전 프로젝트에서는 세션 인증 방식을 사용하면서 다중 서버에서의 중복 로그인 문제, Spring Security 의 세션 관리에 대해서 학습했지만, 이번 프로젝트는 프론트엔드와 백엔드가 분리되고 REST API 방식의 서버 구현이므로 새로운 인증 방식에 대한 부분을 찾아보았다. 그렇게 ..
[Groupware] React : Route (라우팅 설정)
·
Project/Frontend
📝 개요라우팅은 사용자가 URL 을 이동할 떄 그에 맞는 화면 컴포넌트를 보여주는 구조를 의미한다. SPA(Single Page Application) 인 React 에서는 실제로 페이지를 새로고침하지 않고 URL 경로에 따라 필요한 컴포넌트만 렌더링하거나 교체하는 방식으로 동작한다. React 에서 라우팅을 구현하기 위해 사용하는 대표적인 라이브러리가 react-router-dom 이다. 이를 통해 페이지 이동, URL 파라미터 처리, 라우트 보호, 리다이렉트 같은 기능을 손쉽게 구현할 수 있다. 프로젝트에서는 로그인 상태 (accessToken) 를 기준으로 인증 여부를 판단하고 인증되지 않은 사용자는 /login 페이지로 이동되도록 한다. 모든 실제 화면은 / 루트 아래에서 와 을 통해 보여지..
[Groupware] React : axios (API 통신)
·
Project/Frontend
📝 개요Backend 서버와 Frontend 서버와의 HTTP 통신을 위해 axios 라이브러리를 사용한다. axios 를 사용하는 이유는 fetch() 와 비교했을 때 비교적 코드가 간결하고 직관적이기 때문이다. 또한, Interceptor 기능을 통해서 JWT 가 적용되어 있는 Backend 에서 매 요청 마다 헤더에 토큰을 적용하는데 효율적이기 때문이다.다음은 Groupware Frontend 서버에 적용되어 있는 axios 공통 설정에 대해서 설명한다.🚀 axios1️⃣ import 및 CustomAxiosRequestConfig type 설정import axios, { type AxiosRequestConfig } from 'axios';type CustomAxiosRequestConfig ..
[Groupware] Spring-Boot : API 공통 응답 객체
·
Project/Backend
📝 개요API (Application Programming Interface)백엔드 서버가 프론트엔드(혹은 외부 시스템) 에 데이터를 주고받는 통로이다. 흔히 사용하는 “로그인”, “데이터 조회”, “등록” 과 같은 기능을 만들 때 서버는 API 를 통해 클라이언트의 요청을 받고, 처리 결과를 다시 응답으로 돌려준다. JSON(JavaScript Object Notation)대부분의 API 응답은 JSON 형식으로 전달된다. 단순히 데이터만 반환하는게 아니라 상태코드, 메세지, 실제 데이터 를 한번에 담아 보내는 것이 중요하다. 이것을 일관성 있게 관리하기 위해서 공통 응답 객체를 만들어 모든 API 반환 값을 같은 구조로 감싸도록 설계했다.🚀 API 공통 응답 객체API 공통 응답 객체를 도입하기 ..
[Groupware] Spring-Boot : Swagger 연동
·
Project/Backend
📝 개요Swagger?Swagger 는 REST API 를 쉽고 명확하게 문서화할 수 있는 오픈소스 프레임워크이다. 기존에는 API 명세서를 별도로 작성하여 (엑셀, Notion 등..) 관리가 어렵고 오류도 많았지만, Swagger 사용하면 실제 코드로부터 명세를 자동 추출 하여 최신 API 문서를 유지할 수 있다. 또한, Swagger UI 를 통해서 API 테슽와 시연이 편리하여 기획/테스트/FE 와의 협업 효율성이 증가한다. Swagger 도입 이유현재 프로젝트는 요구사항을 정리하는 Notion 에 DTO, Controller 에 대한 설계와 정의를 통해서 명세하고 있지만, API 수가 많아지고 FE 개발 및 설계를 위해서 도입하게 되었다. 🚀 SwaggerAPI 문서 자동화 프레임워크는 여러..