2024. 11. 8. 11:59ㆍ개발/🚀 데브코스
1. 프로젝트 설명
[ 주제 ] 영화 검색 및 조회, 평론 사이트 - Cineverse ( 씨네버스 )
Cineverse의 대략적인 기능
1. 회원 관리
2. 영화 검색
3. 영화 상세 조회
4. 영화 한줄평 작성
5. 영화 블로그 리뷰 작성
6. 영화 찜하기
7. 마이페이지
시연 영상
프로젝트 흐름
2차 - Java, MyBatis
3차 - Kotlin, JPA로 마이그레이션
2~3차 걸쳐서 Front 개발
2. 배운 점
1 ) MyBatis 사용
여태까지 프로젝트에서 JDBC 혹은 JPA만 사용하다가
( 심지어 JPA는 제대로 알지도 못하고 구현만 했움...)
이번 프로젝트 때 처음으로 MyBatis를 사용해봤다
쿼리를 직접 작성하다 보니 JPA보다 시간은 오래 걸렸지만
N+1 문제나 영속 context에 대한 고민이 필요 없었고
SQL 쿼리를 따로 분리하기 때문에 JDBC보다는 코드가 깔끔했다
MyBatis 흐름
1. Repository Interface 생성
협업 시 예상치 못한 충돌을 피하기 위해서
Repository에 구현할 메서드들을 Interface에 미리 선언해놓는다
DibEntity saveNewDib(UUID userId, String movieId);
2. Repository Interface에 선언한 메서드들을 Mapper에 구현
Mapper.xml과 Mapper Interface에 Repository에 구현할 메서드들 쿼리 구현하기
Mapper Interface에 메서드 이름, 매개변수 이름 / 타입, 리턴 타입을 선언해놓고
int saveNewDib(@Param("userId") UUID userId, @Param("movieId") String movieId);
Mapper.xml에서 실질적인 SQL 쿼리 작성
-> Interface에 정의된 이름을 id로 설정
-> Interface가 던져주는 매개변수 이름 그대로 사용, #{} 안에 삽입
<insert id="saveNewDib"> INSERT INTO dib_table(user_id, movie_id) VALUES (#{userId}, #{movieId}) </insert>
-> 이때 xml 설정을 통해서 Mapper.xml에 구현한 쿼리가 Mapper Interface의 메서드들을 구현한 것이라고 선언
<mapper namespace="core.application.users.mapper.DibMapper">
=> 이 주소에 있는 메서드들 구현한거야... 라는 뜻
3. Repository Interface를 구현한 RepositoryImpl 클래스에서 mapper 주입받아서 사용
4. Service 단에서 Repository Interface 주입받아서 사용
2 ) Repository, Service Interface
베이스 코드 작성도 이번 프로젝트에서 정말 상세하게 다뤘던 것 같다
이전 프로젝트에서는 베이스 코드는 패키지 구조, DB table, Entity 코드 작성 정도만 했었는데
이번 프로젝트에서는 이뿐만 아니라 Repository, Service의 interface도 작성하고 init commit을 했다
확실히 이렇게 하니까 다른 도메인들의 Repository, Service 구조까지 파악할 수 있어서 좋았다
내가 A 도메인 쪽을 주로 개발하다가도 B 도메인 쪽 Repository 메서드가 필요할 때가 있는데
그걸 다 미리 고려해서 Base Code에 작성해두니까
일일이 '이 메서드 좀 만들어주세요' 부탁하거나 내가 B 도메인 만지다가 충돌이 발생하는 일이 줄어들었다
3 ) 테스트코드 작성
이번에 테스트코드도 처음 작성해봤다
이건 일단 좀 더 공부하고 따로 글 작성하겠움..!!
다음주부터 시작하는 4차 팀 RBF에서 스터디하기루 해성
4 ) Front - React 경험
으아 진짜 눈물 흘렸던 부분....
너무 힘들었다.....
프론트....
나는 영화 상세 페이지랑 리뷰 상세 페이지 부분, 마이페이지 등을 담당했다
우선 피그마에 디자인을 한 다음에(무슨 사이트에서 영화 사이트 디자인 템플릿 들고 와서 수정했다)
AutoHTML 플러그인 이용해서 React 코드를 뽑아냈다
근데 css든 jsx 파일이든 코드가 너무 구조적으로 엉망인 채로 뽑혀나왔다
React의 구조를 슬쩍 보니까
컴포넌트 ( 자주 사용되는 요소 구현 - ex) 좋아요 버튼, 페이지 넘어가는 버튼 등등 )
services ( API 관련 로직 구현 - 백엔드에서 데이터 GET, POST, PUT 등등 )
얘네들을 각각 분리하고 이외에도 pages, assets, constants, config, styles를 다 분리하는 듯한데
개발 기간이 너무 짧았기에 이 모오오든 것들을 하나의 클래스에서 구현해버렸다....
그래도 프론트를 직접 만져보면서 백엔드랑 소통하는 방법을 알게 되니까
백엔드만 개발할 때는 전혀 필요할 거라고 예상하지 못했던 API들의 필요성을 알게 되었고
( 예를 들어 나는 찜하기 / 찜 취소하기 API만 만들어왔었는데
프론트를 개발하다 보니까 현재 사용자가 특정 영화를 찜했는지 확인하는 API도 따로 필요하겠구나를 알게 되었다 )
API 명세서를 어떻게 작성해야 소통에 용이할지도 알게 되었다
( 사실 이제껏 API 명세서 작성할 때 Response Body의 result에 들어가는 것들만 썼음...
Response / Request Body 완전 전체적인 구조 다 파악할 수 있게 정확히 써야겠다... )
추후에 최종 프로젝트 끝나고 팀원분이랑 리팩토링하기로 했삼
5 ) Github 이제 나름 익숙...
이번 2, 3차 팀에 깃허브 마스터 분들이 계셔서...
그분들한테 깃헙 사용법을 정말 많이 배웠다
이슈 생성, 이슈 트래킹, Project, milestone, develop 브랜치 내용 가져오기, PR 리뷰 등등등
요놈도 게시글 하나 작성하겠움!
3. 아쉬운 점
사실 2, 3차 때 나는 백엔드 구현에 그렇게 많이 참여하지 못했다
백엔드는 찜이랑 마이페이지 API 구현한 정도...?
프론트 구현에 매달리느라 아래 두 마이그레이션에 참여하지 못해서 너무 아쉽다..ㅠㅠ
그래서 팀원들 코드 보면서 조금이라도 따라가보겠다...!!
1 ) MyBatis > JPA 마이그레이션
JPA 공부 빡세게 하고 제대로 올리겠움!
Spring Profile을 이용해서 DAO를 변경해줬다
2 ) Java > Kotlin 마이그레이션
사실 코틀린 마이그레이션은 IntelliJ의 자동 변환 기능 사용하고
버그만 잡으셨다고 한다
https://kghworks.tistory.com/189
[Tip] IntelliJ에서 Java 코드 Kotlin으로 자동 변환하기 Java-to-Kotlin converter
인텔리제이는 자바 코드를 코틀린으로 자동으로 변환해주는 기능을 지원하고 있다. 정확히는 .java 파일을 .kt 파일로 변환해주는 것. 완벽히 변환하지는 않지만 초반에 코틀린이 어색하거나 할
kghworks.tistory.com
우리 팀은 Kotlin의 장점은 아래와 같이 파악했고
1. Null Safety
Kotlin은 NullPointerException (NPE) 문제를 줄여주는 Null Safety를 기본으로 제공
이는 컴파일러 레벨에서 nullable 여부를 확인하여 잘못된 null 할당이나 호출을 막아주기 때문에 런타임 오류를 미리 예방
2. Only Runtime Exceptions
Kotlin은 Checked Exception이 없으며, 오직 런타임 예외(Runtime Exceptions)만 존재
이는 예외 처리를 단순화하고 코드 작성 시 불필요한 예외 처리 구문을 줄여주는 장점이 있음
개발자는 필요한 경우에만 예외를 처리하면 되므로 코드가 간결해지며 유지보수가 쉬워짐
3. Data Classes - Boilerplate 완화
Kotlin의 Data Class는 toString(), equals(), hashCode(), copy()와 같은 메서드를 자동으로 생성해주는 클래스
일반적인 데이터 홀더 객체에서 반복적으로 작성해야 하는 Boilerplate 코드를 줄여주며
데이터를 다루는 데 집중할 수 있도록 도와줌
4. Coroutines - 비동기 프로그래밍에 용이
Kotlin의 Coroutines는 비동기 프로그래밍을 간편하게 처리할 수 있는 도구
이는 특히 네트워크 요청, 파일 IO, 복잡한 비동기 흐름을 다룰 때 유리함
이 장점들을 살릴 수 있는 Controller class와 Service / Persistence layer, DTO 클래스만 Kotlin 마이그레이션을 진행했다
4. 해보고 싶은 거
타 팀들 발표하시는 거 보면서 구현하고 싶은 기술들이 잔뜩 생겼다..!
다들 좋은 의미로 미치셨음... 그냥 그대로 출시해도 될 거 같음...
아직도 공부할 게 남아있어서 데브코스 오신 건가요..? 대체 뭘 더 공부하시려고....
아님 기술들 전수해주시려고...? 감사합니다...
1. Spring Security - 아직도 회원 관리 쪽 개발 못하는 사람... 나야...
2. Redis
- Refresh Token => Redis에 저장
- Pub/Sub => 실시간 데이터 처리 ex ) 실시간 채팅
- Redison 라이브러리 이용해서 동시성 문제 해결 => 비관적 락, 분산 락
3. 카프카 => 실시간 데이터 처리
4. Scheduler / Batch : 서버에 대용량으로 적재된 데이터 뿌릴 때 -> Batch Partitioning
5. AOP로 효율성 체크하기
6. Open API 사용
7. 백엔드/AI 연결
8. CQRS => 조회용 DB, 삽입/수정/삭제용 DB 분리 및 동기화 기술
'개발 > 🚀 데브코스' 카테고리의 다른 글
📆 데브코스 최종 프로젝트 회고 (2) | 2024.12.11 |
---|---|
😺 서버 구동 방식 - Tomcat DispatcherServlet 😺 (1) | 2024.08.15 |
🚀 Java 기초 문제풀이 2 [ 데브코스 백엔드 TIL] (0) | 2024.07.23 |
🚀 Java 기초 문제 풀이 1 [데브코스 백엔드 TIL] (0) | 2024.07.23 |
🚀 Java의 객체지향적 특징 [데브코스 백엔드 TIL] (1) | 2024.07.23 |