1. 테스트의 가치와 필요성스프링이 개발자에게 제공하는 가장 중요한 가치 중 하나는 객체지향과 테스트입니다. 테스트는 코드가 예상대로 정확히 동작하는지 확인하여 개발자에게 "모든 결함이 제거되었다는 확신"을 주며, 디버깅 시간을 단축시켜 줍니다. 잘 설계된 좋은 코드는 테스트하기 좋은 코드가 좋은 코드형태로 보이고 반대로 테스트하기 불편하게 설계된 코드는 좋은 코드라고 보기 어렵습니다. 따라서 충분한 검증이 없는 테스트는 없는 것보다 나쁘므로, 부정적인 상황을 먼저 테스트하는 단위 테스트를 작성하는 습관이 중요합니다. 2. UserDaoTest 다시 보기와 단위 테스트기존의 웹을 통한 테스트 방식은 모든 레이어를 다 만든 후에나 가능하며, 서버 설정 등 외부 요인의 영향을 많이 받아 오류 대응이 어렵..
spring
객체 생성의 역전 - 팩토리 패턴토비의 스프링에 나오고 있는 내용에서 나오는 패턴 중 팩토리 패턴이라는 개념은 객체의 생성의 책임을 팩토리라는 클래스에 위임함으로 전략 패턴과 템플릿 메소드 패턴 등으로 분산되는 객체를 한 곳에서 관리할 수 있게 해줍니다. 왜 이전에 역활과 책임에 따라 분리해두었던 객체를 다시 한 곳에 모아두는 이유가 무엇일까요?팩토리 패턴의 예시이전에 설명했던 알림 모듈을 예시로 들자면 유저에게 알림을 발송할 때 알림톡으로 알림을 보낼 때와 앱 푸시로 알림을 보낼 때 그리고 이메일로 알림을 보낼 때에는 주입받아야 하는 객체가 전부 다릅니다. 아래의 코드를 보면 쉽게 이해할 수 있을 것입니다.// 전략 인터페이스public interface NotificationSender { vo..
중복된 코드의 문제토비의 스프링 1장에서는 DAO의 관심사를 분리하고, 중복된 코드를 한 곳에 모아 상속을 통해 구현하는 방식을 설명합니다. 오래된 개념이지만 현재까지도 자주 사용되는 패턴입니다.예를 들어 알림 발송 모듈을 만든다고 가정해봅시다. 아래 코드에서 사용자 조회와 로그 저장 로직이 각 메서드마다 반복됩니다.만약 사용자 조회가 다른 마이크로서비스 호출로 변경되거나, 로그 저장소가 RDB에서 NoSQL로 바뀐다면 모든 메서드를 수정해야 합니다. 이것이 관심사가 분리되지 않았을 때 발생하는 문제입니다.// 중복이 많은 초기 코드public class NotificationService { public void sendKakaoAlimtalk(String userId, String message..
배포된 서비스에서 특정 API가 리다이렉트되고 난 뒤 401 에러가 발생하면서 문제를 일으키게 되었다. 해당 문제에 대해 원인은 발견하고 해결 했지만 무슨 이유로 생기는지 어떻게 해결해야되는지 정리하면 좋을 것 같아서 정리하게 되었다. 문제가 되었던 컨트롤러 @GetMapping("") public void hello(HttpServletRequest request, HttpServletResponse response) throws IOException { String nickname = "riospring"; logging(request); response.sendRedirect("/api/v1/user/" + nickname); } 내가 원했던 API 통신 path variable을 입력하지 않았을 ..
동일성 보장 영속성 컨텍스트는 자신이 관리하는 영속 엔티티 한에서는 동일성을 보장한다. 프록시로 조회했을 때도 마찬가지다. 예제 @Test public void 영속성_테스트() { Member newMember = new Member("member1"); em.persist(newMember); em.flush(); em.clear(); Member refMember = em.getReference(Member.class, newMember.getId()); Member findMember = em.find(Member.class, newMember.getId()); System.out.println("refMember Type = " + refMember.getClass()); System.out.p..
JPA는 영속성 컨텍스트 내부에서 1차 캐시를 통해 엔티티를 저장하고 생명주기를 관리한다. 그렇기 때문에 1차 캐시를 통해 데이터의 변경을 감지하고 조회할 때도 데이터베이스를 통해 가져올 필요없이 1차캐시 내부에서 가져와서 사용하게 됩니다. 이러한 장점은 어플리케이션 반복 가능해서 읽기가 가능하게 한다. 덕분에 같은 엔티티를 조회시 데이터 베이스를 통해 다시 가져오거나 컨텍스트에 등록할 필요가 없이 재사용할 수 있다. 동일성 테스트 @Service @Transactional @RequiredArgsConstructor public class MemberService { private final MemberRepository memberRepository; public Long join(Member mem..
