티스토리 뷰
1. 프로젝트 소개
‘Ataste’는 기존 망고플레이트 서비스를 역공학하여 제작한 프로젝트로, 주요 기능과 구조를 유지하면서도 개선이 필요한 부분을 보완한 프로덕트입니다. 프로젝트를 진행하며 기존 서비스의 설계 원리와 작동 방식을 분석했고, 이를 바탕으로 새로운 기능을 추가하고 기존 기능을 최적화하는 과정을 통해 시스템 설계와 개선 역량을 키웠습니다. 이러한 경험을 통해 보다 효율적인 시스템을 구현하는 데 필요한 기술적 기초를 다질 수 있었습니다.
담당 업무 | 기획, 백엔드 개발 |
참여인원 / 기여도 | 3명 / 50% |
개발 환경 | SpringBoot, Spring Security, JWT, Spring Data JPA, Docker, Jenkins, AWS S3, 카카오 API |
담당 기능 | 회원가입, 로그인, 외부 API 데이터 처리, CI/CD, 게시판(CRUD) |
2. 주요 성과
✔️ 카카오맵 API를 활용한 데이터 처리
프로젝트에서는 사용자의 검색 요청에 따라 카카오맵 API를 활용해 특정 위치와 관련된 정보를 실시간으로 불러오는 기능을 구현했습니다. 이를 통해 음식점, 카페 등 장소 정보를 상세히 제공할 수 있도록 설계했습니다. API 응답 데이터를 활용하기 위해, JSON 형식으로 반환된 데이터를 파싱하여 클라이언트에서 필요한 데이터만 선별적으로 가공하였습니다. 데이터 항목으로는 장소 이름, 주소, 카테고리, 전화번호, 좌표값 등을 포함했으며, 이를 기반으로 사용자가 필요로 하는 정보를 UI에 직관적으로 제공하였습니다.
✔️ Spring Data JPA를 활용한 쿼리 안정화
기존에는 JDBC로 SQL문을 작성하며 반복적인 코드와 복잡한 데이터 매핑 작업으로 인해 유지보수에 어려움이 있었습니다. 이를 해결하기 위해 JPA를 도입하여, 메서드 이름만으로 간단하게 쿼리를 생성하고, 데이터 매핑 및 자원 관리를 자동화했습니다. 예를 들어, 특정 댓글에 대한 이미지를 조회하거나 좋아요 순으로 정렬하는 기능을 구현할 때, JPA의 메서드 이름 규칙을 활용해 간결하고 가독성 높은 코드를 작성할 수 있었습니다.
< 특정 댓글에 해당하는 이미지 가져오기 >
📖 JDBC로 작성
public List<CommentImage> findByCommentId(Long commentId) {
List<CommentImage> commentImages = new ArrayList<>();
String sql = "SELECT * FROM comment_image WHERE comment_id = ?";
try (Connection connection = dataSource.getConnection();
PreparedStatement statement = connection.prepareStatement(sql)) {
statement.setLong(1, commentId);
ResultSet rs = statement.executeQuery();
while (rs.next()) {
CommentImage commentImage = new CommentImage();
commentImage.setId(rs.getLong("id"));
commentImage.setImageUrl(rs.getString("image_url"));
commentImage.setCommentId(rs.getLong("comment_id"));
commentImages.add(commentImage);
}
} catch (SQLException e) {
e.printStackTrace();
}
return commentImages;
}
📖 JPA 활용
public interface CommentImageRepository extends JpaRepository<CommentImage, Long> {
List<CommentImage> findByCommentId(Long commentId);
}
3. 트러블슈팅
✔️ 문제점
Ataste 애플리케이션을 배포하기 위해 AWS EC2 환경에 JDK 17과 MySQL 데이터베이스를 설치한 후 애플리케이션을 실행했습니다. 초기에는 gradlew clean build 명령어를 통해 빌드한 JAR 파일이 정상적으로 작동했으나, build/libs 경로로 이동해 jar 파일을 백그라운드에서 실행시키는 명령어를 입력하면 아래와 같은 에러 로그가 발생했습니다.
✔️ 해결 시도
1) gitignore 파일에 yml 파일을 올리지 않겠다고 설정해 놔서, clone 받은 코드엔 yml에 정의해 놓은 부분이 빠져 있으니 발생한 오류일 수 있겠다고 생각했습니다. 그래서 직접 resources로 이동해 그 하위에 3가지 yml 파일을 생성해 주었습니다. → 실패
nano application.yml
nano application-oauth.yml
nano application-profile.yml
2) gitignore에서 yml파일을 올리지 않는 부분은 제외시키고, 모든 코드를 깃헙에 올린 후 다시 clone 해 보았습니다. → 실패
✔️ 해결
환경별 설정 파일을 분리하여 application.yml, application-local.yml, application-dev.yml로 나누었습니다. application.yml에는 공통 설정을, application-local.yml과 application-dev.yml에는 각각 로컬과 서버 환경에서 필요한 설정을 추가했습니다. 이 과정에서 spring.profiles.active를 활용하여 서버에서 실행 시 적절한 프로파일이 활성화되도록 설정했습니다.