우아한형제들 산하의 교육 기관으로 10개월 간 프로젝트 운영을 경험하며 2주 간격의 미션을 기반으로 학습합니다.
미션의 각 단계마다 새로운 요구사항을 구현합니다.
각 미션은 페어 프로그래밍, 선배 개발자 혹은 크루 간 코드 리뷰를 바탕으로 진행됩니다.
Project | 목표 | Repository | 1단계 PR | 2단계 PR | 3단계 PR | 4단계 PR |
---|---|---|---|---|---|---|
레거시 코드 리팩터링 |
의존성 방향 수정 모듈 분리 |
Repository | 1단계 PR | 2단계 PR | 3단계 PR | 4단계 PR |
JDBC 라이브러리 구현하기 |
트랜잭션, JDBCTemplate 구현 | Repository | 1단계 PR | 2단계 PR | 3단계 PR | 4단계 PR |
@MVC 구현하기 |
MVC 프레임워크를 구현 레거시를 새 프레임워크 기반으로 수정 |
Repository | 1단계 PR | 2단계 PR | 3단계 PR | x |
Tomcat 구현하기 |
간단한 웹 서버를 제작 스레드 풀을 적용 |
Repository | 1단계 PR | 2단계 PR | 3단계 PR | 4단계 PR |
Enum에서는 valueOf()보다 table switch로 최적화된 switch ~ case를
EntityManager의 merge() 동작 방식 유의점
하루스터디 서비스 기획, 구현 및 운영
Repository
인증 관련 플로우 및 기능 점검
우리 서버는 어느 정도의 부하를 견딜 수 있을까 - 부하 테스트 계획 & 실행
밤에 DB와 서버를 안전하게 예약 중단 배포하기
SpringBoot Application과 Grafana 기반의 Metric & Log 모니터링
언제 JPA를 통해 슈퍼/서브타입을 사용해야 할까?
RDB에 JPA로 변경 가능성이 높은 데이터를 JSON으로 저장하기
Project | 목표 | Repository | 1단계 PR | 2단계 PR | 3단계 PR |
---|---|---|---|---|---|
쇼핑 주문 |
API 구현, 서버 띄우기 프론트엔드와 협업 |
Repository | x | 2단계 PR | x |
지하철 |
복잡한 비즈니스 요구사항 구현 웹 앱에서의 TDD |
Repository | 1단계 PR | 2단계 PR | 3단계 PR |
쇼핑 장바구니 |
쇼핑몰의 상품 관리 CRUD 구현 | Repository | 1단계 PR | 2단계 PR | x |
웹 자동차 경주 |
콘솔 기반 앱을 웹앱으로 변경 Spring MVC 처음 도입 |
Repository | 1단계 PR | 2단계 PR | x |
logback-spring.xml을 사용해 로그 커스터마이즈하기
순수 JDBC + Spring 조합의 웹앱 테스트하기
ViewResolver의 동작 과정
왜 Mockito를 통해 테스트를 해야 할까?
필터와 인터셉터에서 요청에 대한 처리를 어떻게 캐싱할까?
핸들러(컨트롤러 메서드)는 어떤 우선순위로 선택되는가?
왜 Random Port의 SpringBootTest에서는 @Transactional 적용이 되지 않을까?
필드 주입도 순환 참조를 검사해 준다?
외래 키를 사용해야 할까?
@Autowired와 의존성 주입
Project | 목표 | Repository | 1단계 PR | 2단계 PR | 3단계 PR | 4단계 PR |
---|---|---|---|---|---|---|
체스 |
콘솔로 체스 게임 구현 DB로 게임 진행도 저장 |
Repository | 1단계 PR | 2단계 PR | 3단계 PR | 4단계 PR |
블랙잭 |
작은 크기의 클래스로 Clean Code 작성 |
Repository | 1단계 PR | 2단계 PR | x | x |
사다리 타기 |
TDD로 진행 | Repository | 1단계 PR | 2단계 PR | x | x |
자동차 경주 |
단위 테스트 구현 MVC 패턴 적용 |
Repository | 1단계 PR | 2단계 PR | x | x |
왜 try-with-resources를 사용할까?
동일성과 동등성, 그리고 equals와 hashCode
가변 인수 적절하게 사용하기
템플릿 콜백 패턴으로 동일한 작업을 효율적으로 처리하기
원시값을 포장해 사용하자