20241220 시놀인턴 마지막날
2024. 12. 20. 11:01ㆍTIL
오늘로 시놀인턴 4주차가 끝난다.
사실 4주차 월요일즈음부터 우리에게 맡길일이 별로 없는게 눈에 보였기에 수 목 금에 가서는 거의 시간떼우기밖에 할게 없었다.
4주간의 인턴 실적과 배운 점
1. MBTI 검사 기능 개발
- 주요 작업 내용
시놀 앱에 MBTI 검사 기능을 구현. 프론트엔드 인턴 및 디자인팀과 협업하여 피그마(Figma)를 활용해 화면 설계 및 구현 진행.- 질문 설계: 12개의 성향 관련 질문을 MBTI 4글자(EI, SN, TF, PJ) 섹션으로 나누어 3문항씩 작성. 각 답변에 따라 E/I, S/N 등 성향을 판단하도록 설계.
- 결과 처리: 서버로 사용자가 선택한 답변을 통해 계산된 MBTI 결과를 전달. 서버는 결과에 맞는 상세 설명, 성향, 추천 모임, 이미지 등을 반환.
- 부가 기능: 결과 화면에서 유저가 프로필에 MBTI를 적용하거나, 결과를 공유하면 첫 공유에 한해 포인트를 적립하는 기능 추가.
- 데이터 구조 설계: 주요 테이블은 mbti, mbti_question, mbti_profile로 구성.
2. 통계 쿼리 작성 및 개선
- 초기 API 작성
- 나이대 및 성별별 MBTI 비율 산출 API
- 입력값: start_age, end_age (없을 경우 전체), 성별(남/여/전체).
- MBTI 전체 진행 횟수 API
- 출력값: 전체 진행 횟수, 고유 유저 수(userId 0 제외), 공유 횟수.
- 입력값: start_date, end_date (없을 경우 전체).
- 나이대 및 성별별 MBTI 비율 산출 API
- 추가 개선
- 일간/주간/월간 분석 기능 추가.
- 특정 MBTI 타입에 대한 결과만 확인 가능한 필터 추가.
- 주간 분석 시 7일 단위, 월간 분석 시 1개월 단위로 결과를 집계.
배운 점
- 협업의 중요성
- 프론트엔드 및 디자인팀과의 소통을 통해 요구사항을 명확히 이해하고, 피드백을 적극적으로 반영하는 과정에서 협업 능력을 키웠습니다.
- 피그마를 활용한 UI/UX 설계 경험은 실제 사용자 중심의 개발을 경험하게 해주었습니다.
- 데이터베이스 설계와 관계 설정의 유연성
- 관계 설정: 기존에는 외래키를 통해 테이블 간 관계를 명확히 정의했지만, 현업에서는 모든 테이블에 관계를 설정하지 않는 경우가 많다는 점을 배웠습니다.
- 시놀처럼 수백 개 이상의 테이블을 가진 환경에서는 모든 테이블의 관계를 정의하고 유지 관리하기 어렵기 때문입니다.
- 이러한 상황에서 외래키 대신 id 기반 설계로 관계를 암묵적으로 유지하는 방식을 사용했습니다.
- 추가적인 대처 방안:
- 영속성 전파 문제를 방지하기 위해 코딩 시 데이터 정합성 검증 로직을 철저히 구현.
- 관계 설정이 생략된 테이블 구조에서는 ORM(예: JPA)의 Fetch 전략을 신중히 고려하여 Lazy Loading 또는 Eager Loading을 적절히 설정.
- 필요시, 특정 상황에서 데이터베이스의 트리거(Trigger)나 제약 조건을 활용해 데이터의 무결성을 보장.
- 관계 설정: 기존에는 외래키를 통해 테이블 간 관계를 명확히 정의했지만, 현업에서는 모든 테이블에 관계를 설정하지 않는 경우가 많다는 점을 배웠습니다.
- 기존 코드 스타일과의 일관성 유지
- 코드 작성 시 나만의 방식으로 구현하기보다는, 기존 코드 스타일을 분석하고 이에 맞춰 작업하는 것이 중요하다는 점을 배웠습니다.
- 트랜잭션 처리 방식: 기존에는 서비스 단위에서 트랜잭션을 관리했지만, 시놀에서는 컨트롤러에서 트랜잭션을 설정하고 있음을 확인하고 이에 맞춰 코드를 작성.
- 디폴트 리포지토리 활용: 시놀에서는 미리 정의된 디폴트 리포지토리를 사용하여 중복 작업을 줄이고 유지보수를 쉽게 할 수 있도록 설계되어 있음을 알게 되었습니다.
- 이러한 경험은 팀 전체의 코드 일관성을 유지하고 협업 효율성을 높이는 데 중요한 교훈이 되었습니다.
- 코드 작성 시 나만의 방식으로 구현하기보다는, 기존 코드 스타일을 분석하고 이에 맞춰 작업하는 것이 중요하다는 점을 배웠습니다.
- 효율적인 쿼리 작성
- 서버와 데이터베이스 간의 통신은 가장 시간이 오래 걸리는 작업이기 때문에, 한 번에 필요한 데이터를 최대한 가져오도록 최적화된 쿼리 작성이 중요하다는 점을 배웠습니다.
- 반복문 지양: 데이터 요청 과정에서 for문이나 반복적인 호출을 최소화하고, 한 번의 쿼리로 모든 데이터를 가져오도록 설계.
- 서브쿼리 최적화: 모든 데이터를 가져온 뒤 필터링하는 방식보다, 필요한 데이터를 미리 선별(WHERE 조건)하여 효율적으로 가져오는 방식이 훨씬 효과적임을 이해했습니다.
- JOIN 전략: LEFT JOIN과 INNER JOIN의 선택을 작업의 목적에 맞게 신중히 고려. LEFT JOIN은 데이터가 누락될 가능성을 최소화하고, INNER JOIN은 불필요한 데이터를 배제하는 데 유리함.
- 서버와 데이터베이스 간의 통신은 가장 시간이 오래 걸리는 작업이기 때문에, 한 번에 필요한 데이터를 최대한 가져오도록 최적화된 쿼리 작성이 중요하다는 점을 배웠습니다.
- 데드락(Deadlock)에 대한 이해와 예방
- 데이터베이스에 쿼리를 병렬로 수행할 때 데드락 발생 가능성을 염두에 두고, 사전에 이를 방지하는 설계가 중요함을 배웠습니다.
- 예방 방안:
- 트랜잭션 범위를 좁혀 불필요한 잠금을 최소화.
- 테이블 접근 순서를 통일해 데드락 발생 가능성을 줄임.
- 데이터 처리가 많은 경우, 배치 처리나 비동기 처리를 고려.
- 예방 방안:
- 데이터베이스에 쿼리를 병렬로 수행할 때 데드락 발생 가능성을 염두에 두고, 사전에 이를 방지하는 설계가 중요함을 배웠습니다.
- 실제 업무 환경 적응
- 짧은 기간 동안 빠르게 업무 환경에 적응하며 실제 사용자에게 가치를 제공하는 작업을 진행했던 경험은 큰 성취감을 느끼게 해주었습니다.
'TIL' 카테고리의 다른 글
20241204 시놀인턴 8일차 오류수정 (0) | 2024.12.04 |
---|---|
20241128 시놀 인턴 4일차 코드리뷰내용 (0) | 2024.11.29 |
20241127 시놀 인턴 3일차 (0) | 2024.11.27 |
20241125 시놀 인턴 1일차 (0) | 2024.11.25 |
20240801 (목) 한달 인턴 과제 및 온보딩 진행 - 시큐리티 관련 오류 해결 (0) | 2024.08.01 |