늘 계발하는 개발자,
블로그
전체 82025. 06. 21.
1
[워밍업 클럽 4기] 백엔드 4주차 발자국
📌 강의를 통해다양한 케이스의 테스트 코드를 작성하고그에 따른 개발 문서까지 정립하는 등 정말 알찬 강의였다. 📌 미션으로부터도메인 관점에서 생각하는 시야의 확장,테스트 코드에 대한 리소스 통합과도 같은유용한 것들을 많이 배우고 익힐 수 있었다. 📌 회고하며자바 언어가 익숙치 않은 채로 시작해서 나름의 불안감도 있었지만그럼에도 사이사이 적절한 코멘트와 피드백이 있어서잘 따라갈 수 있었다.놓친 것이 없다면, 모든 미션과 출석을 수행한 것 같아서성취감이 상당한 것 같다.짧다면 짧은 시간이었는데, 혼자 했다면 완독 하지 못했을 것 같다는 생각.워밍업클럽과 강사님께 마음 속 깊이 감사를 드리며... 🍀
백엔드
・
워밍업클럽4기
2025. 06. 19.
0
[워밍업 클럽 4기] 백엔드 Day 18. Mock & Test Code
📌 @Mock, @MockBean, @Spy, @SpyBean, @InjectMocks 이란?@Mock: Mockito 로 생성한 가짜 객체를 테스트에서 사용할 수 있다.@MockBean: mock 객체를 등록해서 통합으로 사용할 수 있다.@Spy: 실제 객체를 일부만 부분적으로 mocking 할 수 있다.@SpyBean: spy 객체를 등록해 통합으로 사용할 수 있다.@InjectMocks: @Mock 객체들을 주입받는 대상에 사용할 수 있다.📌 테스트 코드 작성해 보기@BeforeEach void setUp() { 1-1. 2-1. 3-1. 사용자1 생성에 필요한 내용 준비 1-2. 2-2. 3-2. 사용자1 생성 1-3. 2-3. 3-5. 게시물1 생성에 필요한 내용 준비 1-4. 2-4. 3-6. 게시물1 생성 } @DisplayName("사용자가 댓글을 작성할 수 있다.") @Test void writeComment() { // given 1-5. 댓글 생성에 필요한 내용 준비 // when 1-6. 댓글 생성 // then 검증 } @DisplayName("사용자가 댓글을 수정할 수 있다.") @Test void updateComment() { // given 2-5. 댓글 생성에 필요한 내용 준비 2-6. 댓글 생성 // when 2-7. 댓글 수정 // then 검증 } @DisplayName("자신이 작성한 댓글이 아니면 수정할 수 없다.") @Test void cannotUpdateCommentWhenUserIsNotWriter() { // given 3-3. 사용자2 생성에 필요한 내용 준비 3-4. 사용자2 생성 3-7. 사용자1의 댓글 생성에 필요한 내용 준비 3-8. 사용자1의 댓글 생성 // when 3-9. 사용자2가 사용자1의 댓글 수정 시도 // then 검증 }
백엔드
・
워밍업클럽4기
2025. 06. 17.
0
[워밍업 클럽 4기] 백엔드 Day 16. Layered Architecture
📌 Layered Architecture란?Persistence LayerBusiness LayerPresentation Layer각각 리포지토리, 서비스, 컨트롤러 단을 케어하는 레이어. 📌 Persistence Layer데이터베이스로부터 직접적인 처리를 담당하는 레이어.SpringData JPA 혹은 QueryDSL 같은 도구를 사용하며리포지토리에 작성한 쿼리문이 정상 작동하는지 테스트한다. 📌 Business Layer서비스단에서의 비즈니스적 로직을 처리하는 레이어.로직에 의한 데이터의 처리를 수행하기 때문에 Persistence Layer에 의존적인 관계이다.데이터를 처리한 이후에 롤백하는 과정들 또한 필요하다. 📌 Presentation Layer외부 세계와의 소통을 해야 하지만, 그 외부인의 유효성 검증 또한 필연적이다.Mock을 사용하여 테스트를 진행할 수 있다.데이터를 받아서, 데이터를 응답하는 과정까지 모두 테스트한다. 📌 미션을 진행하며,벌써 강의가 다 끝나간다는게 믿기지 않는다.다방면으로 더 열심히 공부하고 연구해야겠다는 생각이 든다.
백엔드
・
워밍업클럽4기
2025. 06. 15.
1
[워밍업 클럽 4기] 백엔드 3주차 발자국
📌 강의를 통해비교적 가벼운 프로젝트를 통해 비즈니스 로직을 구현하면서그에 따른 엔티티 단위의 테스트부터 리포지토리 단위의 넓은 범주의 테스트까지 진행했다.직접 작성한 코드의 테스트를 구성하는게 뭔가 막막할 때가 있었는데코드가 테스트 친화적인? 작성법이 아니었던 것.TDD적인 코드 작성법에 대해 조금 더 파악할 수 있는 시간이었다.📌 미션으로부터아직 관련된 리뷰를 보지 못했지만첫 주에 테스트 코드를 작성한 이유가 있는 것 같다.미션 나중에 다시 해야지. 📌 회고하며테스트 코드로부터 실제 코드까지 이어지도록 작성하는 것이 뭔가 쉽지 않았었지만그나마 조금씩 라인이 그려지는 느낌이다.근데 뭔가 아직 명확하게 눈에 잡히지는 않는 걸 보니강의 2회독 하라는 계시인가..
백엔드
・
워밍업클럽4기
2025. 06. 08.
1
[워밍업 클럽 4기] 백엔드 2주차 발자국
📌 강의를 통해읽기 좋은 코드에 대한 고민으로부터 시작해 이제는 테스트 코드에 대한 배움과 더불어 고찰까지.개발자는 타인에게는 어떤 해결책을 제시하는 T스러운 사람이라고 생각했지만동료 간의 이해와 공감과 같은 F 모먼트도 역시 필요하다는 생각이 들었다.'은탄환은 없다'는 말이 새삼 떠오른다. 명심, 또 명심. 📌 미션으로부터동일한 코드를 리팩토링 해도, 모두가 다른 생각을 가지고 있다는 게 당연하면서도 새삼 신기했다.정답은 없지만, 정답에 가까운 것을 찾아 가는 과정일 것이다.과거에는 코드는 0과 1. 맞거나 틀리거나 라는 생각을 했던 적도 있었던 것 같은데.리팩토링을 통해 결과까지의 흐름과 그에 대한 과정의 명료함에 좀 더 집중할 수 있었다.과정은 결과만큼이나, 혹은 결과 이상으로 중요하다. 📌 회고하며강의가 많은 듯, 많지 않은 듯 갸웃 하며 천천히 따라가다 보니 벌써 절반이다.이래서 시작이 반인가 싶다.이어지는 테스트 코드 강의 또한 열심히.🔥
백엔드
・
워밍업클럽4기
2025. 06. 01.
1
[워밍업 클럽 4기] 백엔드 1주차 발자국
📌 강의를 통해우리는 많은 것들을 추상하고 있다. 추상한 것들을 당연하게 여기는 것들이 많았는데, 더 좋은 코드를 작성하려면 이를 좀 더 상세하게 구체할 수 있어야 한다는 생각이 들었다.어떻게 더 객체지향적으로, SOLID하게 작성하는지 배울 수 있는 시간이었다.클린 코드에 대해 지속적으로 고민했었던 반면, 이에 대한 고민을 구체하지 못했었는데 잘한 선택이라고 느낀다.90%가 AI에 의해 대체 될 수 있다고 한다면, 10%의 인비져블 썸띵이 될 수 있도록. 📌 미션으로부터읽기 좋은 코드를 작성하기 위해 어떤 사고를 지녀야 하는 지에 대해 고민할 수 있는 시간이었다.많은 시간이 필요하진 않았지만, 많은 고민을 할 수 있었다.작성자 본인을 포함한 조상님이 아닌, 후손들이 보고 이해하기 좋은 코드를 작성 해야겠다는 생각을 했다.사고의 단계를 보다 더 미니멀하게 인지할 수 있도록. 📌 회고하며이전에는 내가 작성한 코드를 다른 사람들이 보았을 때 읽기 좋은 코드인지에 대해 약간 주관적으로 생각하며 작성했었던 반면, Readable Code: 읽기 좋은 코드를 작성하는 사고법 강의를 통해 조금 더 객관화하여 바라볼 수 있는 시각이 길러진 것 같다.마치 가독성이 좋은 글을 써 내려 가는 것처럼, 내가 작성한 코드도 누군가에게 막힘 없이 술술 읽힐 수 있을지에 대해 고민하는 그런 느낌.강의를 듣기 시작한 이전에도 그랬지만, 그간 작성한 코드를 문득 떠올려 보니 왠지 더 부끄럽고 그렇다. 동일한 강의를 일정 기간에 맞춰 함께 진행하는 스터디 모임을 해본 것은 처음인데, 혼자 계획을 세우고 공부하는 것보다 더 동기부여가 되고 완주에 대한 의욕이 고취되는 느낌이다.완독한 강의가 여직 많지 않았는데, 이번에는 느낌이 좋다. 마지막까지 의지의 끈을 놓치지 않기를.
백엔드
・
워밍업클럽4기
2025. 05. 30.
0
[워밍업 클럽 4기] 백엔드 Day 4. 객체 지향과 SOLID
🎯 읽기 좋은 코드 (refactor)as-ispublic boolean validateOrder(Order order) { if (order.getItems().size() == 0) { log.info("주문 항목이 없습니다."); return false; } else { if (order.getTotalPrice() > 0) { if (!order.hasCustomerInfo()) { log.info("사용자 정보가 없습니다."); return false; } else { return true; } } else if (!(order.getTotalPrice() > 0)) { log.info("올바르지 않은 총 가격입니다."); return false; } } return true; }to-bepublic class OrderException extends RuntimeException { public OrderException(String message) { super(message); } } public boolean validateOrder(Order order) { if (order.hasNoItems()) { throw new OrderException("주문 항목이 없습니다."); } if (order.hasInvalidTotalPrice()) { throw new OrderException("올바르지 않은 총 가격입니다."); } if (order.isMissingCustomerInfo()) { throw new OrderException("사용자 정보가 없습니다."); } return true; }📌 SOLID란 (SRP, OCP, LSP, ISP, DIP)어떤 객체에 대해 의존적인 기능들이 변경 된다 하더라도 다른 부분에 있어 영향력을 최소화 하는 것이 책임적으로 바람직할 것이다. 클래스로 태어난 인생, 뚝심 있게 한 우물 파도록 하자.새로운 기능이 생성될 때, 기존의 기능에 영향을 주지 않고 새로운 기능만 온전히 추가되도록 해야 한다. 각 기능에 의리 있는 객체가 되도록 하자.자식 클래스가 부모 클래스의 기능을 대체할 수 있어야 한다. 부모님의 면을 세워드리자.인터페이스는 잘게 쪼개어 의존적이지 않게 구현해야 한다. 여러 곳에 발 걸치지 말고 명료하고 구체적으로.어떤 구체 간의 관계에서 의존적인 관계는 바람직하지 않기에 추상한 것을 의존하도록 추구하자.
백엔드
・
워밍업클럽4기
2025. 05. 28.
0
[워밍업 클럽 4기] 백엔드 Day 2. 추상과 구체 미션
📌 추상워밍업 클럽 백엔드 미션을 수행한다.📌 구체0과 1로 이루어진, 추상으로 가득한 어떤 기기와 운영 체제, 소프트웨어를 통한 네트워크 망 내에서누군가가 누군가와 함께 자랄 수 있도록 구성해 놓은 공동체 안에서 어떤 우연한 의도와 계기로 만나그 안에서 또 하나의 작은 모임을 이루어 서로가 서로를 응원하고 배우며그로부터 익히고 습득한 내용을 서술하는 행위를 한다.
백엔드
・
워밍업클럽4기