전체 글

전체 글

    [우아한테크코스] LV2 - 웹 장바구니 협업 미션 회고

    [우아한테크코스] LV2 - 웹 장바구니 협업 미션 회고

    들어가면서 (임시저장만 해두고 발행을 누르지 않은 것을 반성합니다) 우아한테크코스 레벨2의 마지막 미션은 웹 장바구니 협업 미션이었다. 이번 페어는 키아라와 주드였다. 프론트, 안드로이드 크루들과도 함께 팀을 이루어 미션을 진행하는 방식이었는데 랜덤 배정 결과 프론트 크루들과 함께 미션을 진행하게 되었다. step 0, 1 에서는 서버를 AWS 상에 배포하고 CORS 문제를 해결하는 과정이 핵심이었다. 그리고 step2에서는 장바구니에 담은 물품들을 실제로 주문을 할 수 있도록 기능을 추가 구현하는 것이었다. 이와 더불어 할인 정책과 관련된 기능을 선택해서 추가하는 것 또한 요구사항이었는데 우리는 포인트 적립 및 사용 정책을 구현하는 것을 결정했다. 같이 협업을 하게된 프론트 크루들은 솔로스타와 네이브였..

    [Logging] Logback을 이용한 기본적인 로깅하기

    들어가면서 현재 진행중인 팀 프로젝트 하루스터디 서비스는 배포가 완료된 상태입니다. 배포 완료의 기쁨을 느꼈던 것도 잠시, 저희는 실제 배포 환경에서 서비스를 운영하면서 마주치는 버그와 이슈 상황들을 바로 마주하게 되었습니다. 로컬 환경에서라면 인텔리제이의 debug 기능을 활용하거나 정말 단순하게는 System.out을 통해 원하는 값을 직접 출력 해볼 수도 있을 것입니다. 하지만 현재 하루스터디 서비스는 배포 서버에 이미 배포가 되어 있는 상태라서 기존 방식으로는 버그와 이슈 상황들에 대한 원인 파악이 쉽지 않았습니다. 따라서 이를 해결하기 위해 로깅 기능을 구현해서 도입하기로 결정했습니다. 본 포스팅은 팀 로깅 작업을 진행하기 전 개인적으로 진행한 학습 내용을 정리하기 위한 것임을 밝힙니다. SLF..

    [Spring Data JPA] Save() 메서드 persist VS merge

    Spring Data Jpa에서 엔티티를 영속화 하기 위해서 repository 인터페이스를 만들고 save 메서드를 정의해 사용하는 것이 일반적이다. 그런데 학습과정에서 JpaRepository 인터페이스의 save 메서드 구현 코드를 접하게 되었다. 아래에 나온 코드는 org.springframework.data.repository.CrudRepository 의 기본 구현체로 제공되는 SimpleJpaRepository 클래스에 구현되어 있는 save() 메서드다. @Transactional @Override public S save(S entity) { Assert.notNull(entity, "Entity must not be null"); if (entityInformation.isNew(ent..

    엔티티 간 상속관계를 DB 모델로 구현하기 위해 Join 전략을 선택하는 이유에 대한 고찰

    들어가면서 위 이미지는 현재 하루스터디의 DDL을 도식화한 ERD입니다. 간략하게 각 테이블을 엔티티 단위로 묶어서 설명해보면 다음과 같습니다. study : 하루스터디 서비스에서 개설되는 스터디에 대한 정보를 관리 member_progress : 개설된 스터디에서 참여자들의 진행 정보를 관리 member_record : 참여자들이 스터디의 각 사이클마다 진행한 사전 계획과 회고를 관리 member : 참여자들의 개인 정보를 관리 participant_code : 스터디 방 개설 후 입장 시 필요한 참여코드를 관리 여기에서 주목할 것은 study, member_progress, member_record 테이블입니다. 현재 ERD에서는 한 눈에 알아보기 힘들긴 하지만 이 테이블들은 전부 Join전략을 통해..

    브랜치 전략에서 squash and merge 방식 사용에 대한 고찰

    들어가면서 우아한테크코스 레벨3에서 현재 팀 프로젝트(이하 하루스터디)를 진행하고 있다. 하루스터디 서비스 개발을 시작하기 전에 서비스 기획과 더불어서 팀 컨벤션을 정하는 회의를 많이 진행했다. 그 중 Git 브랜치 전략도 팀 컨벤션으로 정하였는데 이 기간에 예비군 훈련과 겹쳐서 직접적으로 팀원들과 브랜치 전략을 연습하고 정하는 시간에 함께하지 못했다. 이후 팀원들이 정리해둔 문서를 보며 혼자 브랜치 전략을 연습하던 와중 마주한 문제가 있었는데 이를 정리하고자 한다. squash and merge 사용 시 직면한 문제상황 위 이미지에 나온 것 처럼, main 브랜치에서 프로덕션 코드를 관리하고 develop 브랜치에서 기능 구현 작업들이 완료되면 main 브랜치에 PR을 날리는 방식으로 운영한다고 가정했..

    [우아한테크코스] LV3 - 1차 스프린트 회고

    [우아한테크코스] LV3 - 1차 스프린트 회고

    1차 스프린트에서 만난 문제상황과 해결책 소프트 스킬 데일리 미팅 개인 일정 정리 문제점 : 근로를 진행하는 크루들이 있어 workout 시간을 온전히 활용하기는 힘들다는 문제가 있었다. 해결책 : 팀 전체적으로 진행하는 회의 및 일정을 중간에 흐름이 끊기지 않게 잘 조절할 수 있었다. 서비스 기획 회의 진행 문제점 : 회의를 진행하다보면 원래 해결하기로 했던 안건에서 점점 벗어나는 경우가 발생했다. 해결책 : 팀이 해결해야할 안건을 정하고 해당 안건을 얘기하는 회의 시간을 구체적으로 미리 정해두고 회의를 진행한다. 정해진 회의 시간이 지나면 원래 얘기하기로 했던 안건에 대해 잘 논의되었는지 확인한다. 또한 회의 중간에라도 처음 안건과는 주제가 멀어지게 된다면 즉시 브레이크를 걸고 회의를 시작했던 안건을..

    [우아한테크코스] 중간 회고

    우아한테크코스 레벨1과 2를 지나고 3에 들어와 팀 프로젝트를 진행하고 있다. 본격적으로 프로젝트를 시작하기에 앞서 다시 헤매지 않기 위해 여태까지 해왔던 학습 방향과 생각들을 정리하고자 한다. 레벨2 막바지부터 방학 내내 이어졌던 감정에 대해 되돌아보았다. 주변 크루들에게는 '번아웃의 3분의 2지점에 서있는 듯한 기분이다' 라고 얘기를 종종 했던 것 같다. 그런데 곰곰히 생각해보면 체력적으로 부치는 건 아니었고, 뭔가 어려운 문제를 직면했던 것도 아니었다. 꽤 긴 시간 결론을 내리지 못했었는데 감정의 핵심적인 부분은 다음과 같이 정리되었다. 공부해야할 건 많은데, 궁금한 건 많은데 해야할 것들은 쏟아져 오는 상황이다. 그런데 조금 전에 공부한 것도 기억 안나고 정리해뒀던 것들을 봐도 뭘 위해 이렇게 정..

    Domain 그리고 Entity, VO에 대한 개인적인 고찰

    들어가면서 우테코 레벨 2에 들어와 DB를 프로젝트에 도입하게 된 이래로 지금까지 도메인을 설계하면서, 도메인 객체에서 ID를 갖는 것이 당연하다고 생각해왔다. 여태까지는 이렇다 할 복잡한 비즈니스 로직이 없었고 간단한 검증만을 필요로 할 뿐 기본적인 CRUD 기능 구현이 주된 목표였기에 도메인 설계 시 상태값으로 ID를 가지는 것이 자연스러웠다. 하지만 상대적으로 복잡한 비즈니스 로직을 가지는 지하철 미션을 진행하면서, 도메인 객체에 ID를 부여하는 것에 대해서 다시 한 번 생각하게 되었다. 다음과 같이 노선의 역과 역사이의 구간 정보를 나타내는 Section이라는 객체를 설계하고 ID를 부여했다. public class Section { private final Long id; private fina..