블로그
전체 52025. 03. 31.
0
인프런 워밍업 클럽 스터디 3기 - 4주차 발자국
Mock과 테스트 코드워밍업을 시작하기 전까지는 테스트 코드라는 개념을 전혀 알지 못했습니다. 테스트 코드는 나중에 시간이 나면 하겠지 하고 미뤄왔던 부분이었습니다. 그런데 테스트 코드를 공부하면서 정말 신세계를 경험하게 되었습니다.Postman을 통한 테스트가 아닌 인텔리제이에서 직접 테스트를 할 수 있게 되면서, 화면을 왔다 갔다 할 필요 없이 훨씬 편리하게 작업할 수 있었습니다. 그 편안함이 정말 좋았습니다. 왜 그동안 미뤄왔을까, 후회할 정도였습니다.처음에는 기존 코드처럼 작성해서 실제 객체와 데이터베이스를 사용하며 데이터를 저장하다 보니 결과가 계속 달라져서 혼란스러웠습니다. 그러나 Mock을 배우면서 가짜 객체를 생성하고, 그 가짜 객체로만 테스트를 진행하고 초기화하니 실제 운영 DB에 아무런 영향도 주지 않게 되어 정말 놀랐고, 너무 좋았습니다.Mock TestCode는 나에게 진정한 신세계를 열어준 도구였습니다. 4주차 발자국 회고록3월에 시작하여 벌써 4월이 다가왔습니다.인프런 워밍업 스터디 3기를 시작하기 전에는 공부 방법에 대해 고민하며 방황했던 시간이 많았습니다. 그러나 용기를 내어 신청했고, 포기하지 않고 끝까지 마칠 수 있었습니다.강의를 들으면서 많은 것을 배웠고, 내 코드가 성장하는 모습을 확실히 체감할 수 있었습니다.테스트 코드테스트 코드에 대해 전혀 알지 못하던 제가 이제는 테스트 코드를 작성할 수 있게 되었고, 그 개념에 대해 이해할 수 있는 단계에 도달한 것 같아 뿌듯합니다. 아직 강의 후반부는 어려운 부분이 많아서 계속 학습을 이어나가야 할 것 같습니다.인프런 워밍업 3기를 수료하면서 이전에는 전혀 없던 서류 합격을 경험했고, 지난주에는 처음으로 면접을 봤습니다. 면접 결과는 아쉬웠지만, 그 과정에서 제가 많이 성장했음을 느꼈습니다. 이 경험을 바탕으로 흐름을 타고 취업까지 가보겠습니다!한 달 동안 함께 고생한 모든 분들, 정말 수고 많으셨습니다!
2025. 03. 25.
0
인프런 워밍업 클럽 스터디 3기 - 백엔드 클린 코드, 테스트 코드 미션 - Day 16
Layered Architecture는 왜 사용하는 걸까?핵심 개념: 관심사의 분리 (Separation of Concerns)Layered Architecture의 핵심 목적은 관심사의 분리입니다.그렇다면 왜 관심사를 분리해야 할까요?가장 큰 이유는 유지보수성과 확장성 때문입니다.사용자의 요청이 들어왔을 때, 각 Layer가 명확한 책임을 갖고 동작한다면 코드 수정이나 기능 추가가 훨씬 쉬워집니다.Spring Boot에서의 관심사 분리Spring Boot로 개발할 때 우리는 자연스럽게 관심사를 다음과 같이 나누게 됩니다:Controller (Presentation Layer): 사용자의 요청을 받고 응답을 반환Service (Business Layer): 비즈니스 로직 처리Repository (Persistence Layer): 데이터베이스 접근 및 처리아래 예시를 보면서 각 Layer의 역할을 살펴보겠습니다.Presentation Layer사용자의 요청을 받고 요청값을 검증 후 반환합니다. @RestController @RequiredArgsConstructor public class UserController { private final UserService userService; @GetMapping("/login") public LoginResponse login(@RequestBody @Valid LoginRequest loginRequest) { return service.login(loginRequest); } } @Vali를 통해 LoginRequest을 검증합니다.Business Layer비즈니스 로직을 수행하는 핵심 구간입니다. @Service @RequiredArgsConstructor public class UserService { private final UserRespository userRepository; public LoginResponse login(LoginRequest loginRequest) { Users user = userRepository.findByEmail(loginRequest.email()) .orElseThrow( LoginErrorCode.EMAIL_NOT_FOUND::exception ); if(user.matchPassword(bCryptPasswordEncoder, loginRequest.password())) { throw LoginErrorCode.PASSWORD_NOT_FOUND.exception(); } return LoginResponse.builder() .username(user.getUsername) .build(); } Persistence Layer 데이터베이스 접근을 담당합니다. public interface UserRepository extends JpaRepository { }이렇게 각 레이어가 자신의 역할에 집중하면:- 수정과 확장이 쉬워지고- 테스트 코드 작성도 쉬워지며- 유지보수성이 높아집니다.테스트 코드 작성저는 주로 서비스단을 테스트 코드로 작성해서 검증합니다.서비스쪽이 비즈니스 로직을 담당하고 있는 부분이라 생각하여 제일 중요하다 생각합니다. 그래서 이번에 채팅방 생성하는 테스트 코드를 저의 방식대로 해봤습니다.@ActiveProfiles("test") @SpringBootTest class ChatRoomTest { @Autowired private ChatRoomRepository chatRoomRepository; @Autowired private UserRepository userRepository; @Autowired private BoardRepository boardRepository; @Autowired private ChatService chatService; @DisplayName("방 생성 테스트") @Test void createRoom() { // given Users user = userRepository.findById(1L).orElseThrow(); Product product = boardRepository.findById(1L).orElseThrow(); Users user2 = userRepository.findById(2L).orElseThrow(); Product product2 = boardRepository.findById(2L).orElseThrow(); ChatRoomRequest request = ChatRoomRequest.builder() .userId(user) .productId(product) .name("테스트 채팅방") .build(); ChatRoomRequest request2 = ChatRoomRequest.builder() .userId(user2) .productId(product2) .name("테스트 채팅방2") .build(); List chatRoom = ChatRoom.create(List.of(request, request2)); List save = chatRoomRepository.saveAll(chatRoom); // when var chatRooms = chatRoomRepository.findAll(); // then assertThat(chatRooms).hasSize(2); assertThat(chatRooms.get(0).getProductId().getId()).isEqualTo(1L); assertThat(chatRooms.get(0).getProductId().getId()).isEqualTo(2L); } } application-test.yml을 만들어 테스트 환경을 구성하였으며 그 구성 기반으로 더미 데이터(data.sql)를 만들어서 테스트를 진행했습니다.
2025. 03. 23.
0
인프런 워밍업 클럽 스터디 3기 - 실용적인 테스트 가이드 3주차
3주차인프런 워밍업 클럽 스터디를 시작한지 벌써 3주차다. 처음에는 읽기 좋은 코드를 작성하는 법에 대해 강의도 보고 중간점검 때 여러 사람들의 리펙토링한 과정에서 피드백 받는걸보며 많은걸 배웠다. 테스트 코드강의를 보기 이전에는 테스트 코드를 전혀 쓰지 않았다. 코드를 작성하고 실행 시키고 Postman을 통해 원하는 결과를 보며 항상 코드를 작성하였으며 실행이 내가 원하는대로 안되었을 땐 다시 코드 작성 후 재 실행하면서했다. 하지만 이번 테스트코드를 배우면서 테스트 코드의 중요성을 깨달았고 엄청 좋다는것을 느꼈다. 이전엔 코드를 고칠 때마다 인텔리제이를 재실행 할 때마다 시간이 오래 걸렸지만 테스트 코드는 내가 원하는 부근만 테스트를 하다보니 더욱 빠르게 해결할 수 있었다.회고이번 인프런 워밍업 클럽 스터디 3기를 시작하길 잘한거같다. 이전에 혼자 공부했을 땐 만들기만 하면 되는 줄 알았는데 인프런워밍업 3기를 하면서 어떤식으로 해야 더욱 효율적으로 만들 수 있는지 배울 수 있었다.
2025. 03. 16.
0
인프런 워밍업 클럽 스터디 3기 - 백엔드 클린 코드, 테스트 코드 2주차 발자국
회고록 중간 점검벌써 2주가 지나 중간점검을 했다.중간검사 때 다양한 Q&A와 코드 리뷰를 접할 기회가 있었다. 다른 사람의 코드를 보며 '이렇게 정리할 수도 있구나!'라는 깨달음을 얻었고, 내 눈에는 보이지 않았던 다양한 접근 방식이 신기하고 흥미로웠다.실제 코드 리뷰를 보는 것은 처음이었는데, 아직 모든 내용을 이해하기는 어렵지만 새로운 접근법과 사고방식을 배울 수 있어 좋은 경험이었다.테스트 코드Practical Testing: 실용적인 테스트 가이드강의를 듣기 전까지는 테스트 코드를 사용하는 방법을 몰라 항상 인텔리제이를 실행하고 Postman으로 테스트를 진행했다. 그러다 보니 코드를 수정할 때마다 다시 실행해야 했고, 로딩 시간이 아깝게 느껴졌다. 하지만 이번 강의를 통해 테스트 코드의 필요성을 깨달았고, 왜 지금까지 사용하지 않았는지 후회될 정도였다.이제라도 테스트 코드를 배우게 되었으니 적극적으로 활용하고, 반복적인 테스트 작업을 줄이는 방향으로 개발해야겠다. 강의 출처 : [https://www.inflearn.com/course/practical-testing-%EC%8B%A4%EC%9A%A9%EC%A0%81%EC%9D%B8-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EA%B0%80%EC%9D%B4%EB%93%9C/dashboard]
2025. 03. 12.
1
[인프런 워밍업 클럽] 스터디 3기_백엔드 클린 코드, 테스트 코드 1주차 발자국
회고록 섹션 4. 객체 지향 패러다임을 들으며 미션을 통해 아직 많이 미숙하지만 SOLID에 대해 좀 더 가까워지는 계기가 되었다. public class Mission { public 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; } }public class MyExplanation { public boolean validateOrder(Order order) { if(order.getItems().size() == 0) { log.info("주문 항목이 없습니다."); return false; }else { return validateOrderDetails(order); } return true; } private static boolean validateOrderDetails(Order order) { if(hasNonZeroTotalPrice(order)) { return isCustomerInfoPresent (order); } log.info("올바르지 않은 총 가격입니다."); return false; } private static boolean isCustomerInfoPresent (Order order) { if(order.hasCustomerInfo()) { return true; } log.info("사용자 정보가 없습니다."); return false; } private static boolean hasNonZeroTotalPrice(Order order) { return order.getTotalPrice() > 0; } }이런식으로 풀어봤다. 현재는 여기까지가 최대이지만 나중에 강의를 다 듣고 한번 더 리펙토링 해보며 이전 코드와 비교해보는 시간을 가져볼것이다.[인프런 워밍업 클럽 스터디 3기_백엔드 클린 코드, 테스트 코드]