본문 바로가기

Spring

(41)
JPA 복기하기 2 : 영속성 컨텍스트와 엔티티 생명주기 영속성 컨텍스트를 알아야 하는 이유jpa의 핵심인 영속성 컨텍스트에 대한 이해가 부족하면 sql을 직접 사용해서 개발하는 것보다 못한 상황이 벌어진다!뭔지도 모르면서 냅다 기술만 갖다 쓰는 최악의 경우가 된다는 것!!!즉, jpa의 핵심 == 영속성 컨텍스트 ORM자바의 객체와 데이터베이스의 데이터를 매핑해주는 방법 JPA자바에서 orm 표준으로 사용하는 인터페이스 Hibernateorm 프레임워크이자, jpa 구현체, 내부적으로는 jdbc api를 사용함 JPA의 핵심요소1. Persistance Unit : 데이터베이스 연결을 위한 설정, jdbc 드라이버, url, 사용자 이름, 비밀번호 등, 스프링에서는 properties나 yml로 설정할 수도 있음2. Entity Manager Factory..
JPA 복기하기 1 : 다대일 관계와 N+1 문제해결 및 페이징 새로운 사이드 프로젝트를 시작하면서 엔티티부터 처음부터 만들기 시작했다!!그런데,,,!! 만들면서 다대일 관계나 엔티티에 붙이는 어노테이션, N+1 문제 같은 것들이 기억이 흐릿흐릿 해진 것이다 😳엔티티를 구성하면서 기억이 가물가물했던 부분들을 다시 정리해보고자 한다엔티티 만들기애매모호 개념 1 : @NoArgsConstructor(access = AccessLevel.PROTECTED)를 왜 쓰는걸까?protected 접근 범위같은 패키지 내의 클래스다른 패키지라도 상속한 자식 클래스엔티티의 생성자를 protected로 제한을 걸었을 때 이점JAP는 리플랙션을 사용해서 엔티티객체를 만들기 때문에 기본 생성자가 필요함저렇게 기본 생성자를 생성할 수 있는 범위를 정해주면 외부에서 실수로 new Enti..
FCM 알람 전송 재시도 구현하기 Docconneting프로젝트에서 알람 전송기능을 모두 구현했다하지만 알람을 전송하고 실패하는 경우가 분명히 발생하고, 이 경우에 사용자가 알람을 받지 못한다면 이건 꽤나 큰 문제라는 생각이 들었다그래서 이를 해결하기 위해서 알람 재시도를 구현해야겠다고 마음을 먹었다!문제 상황@Async("fcmExecutor") public void sendMulticastAlarm(List fcmTokenBatche, String content) { try { MulticastMessage message = MulticastMessage.builder() .setNotification(Notification.builder() ..
컨트롤러 테스트에 인증/인가가 들어있는 경우 @SpringBootTest를하면 모든것이 다 빈으로 등록이 되니까 자연스럽게 테스트가 됨@WebMvcTest 사용하면 컨트롤러만 빈으로 등록이되서 ArgumentResolver랑 JwtFilter 를 수동으로 등록을 해줘야 작동을 한다!JpaMetamodelMappingContext : Spring Data JPA의 자동 설정 중 하나인 JpaMetamodelMappingContext가 없어 생기는 빈 등록 예외를 방지하기 위해서 주입또한 컨트롤러는 Argument Resolver랑 Converter 같은걸 거치니까 새로운 객체가 생겨서 eq로 내용이 동일한지 확인해줘야함 기존에 @WebMvcTest를 사용했는데 수동으로 등록하지않았다면 AuthUser에 필드가 다 null이었음 ⇒ any()를 써버리..
FCM의 구조와 이를 구현하기 위한 고민(Feat : FCM토큰관리와 전송 메서드) FCM 구조무료로 메시지를 보낼 수 있는 교차 플랫폼 메시징 클라우드 서버 장점Firebase 플랫폼과 통합되어 있어 설정과 사용이 간편Firebase 콘솔에서 설정을 쉽게 관리할 수 있음안드로이드, iOS, 웹을 포함한 여러 플랫폼에서 사용 가능Google의 인프라를 기반으로 하여, 대량의 메시지를 안정적으로 처리할 수 있음FCM은 무료로 제공되며, 추가 비용 없이 사용할 수 있음주제 기반 메시징, 메시지 우선순위 설정, 다양한 메시지 타입 지원(알림 메시지, 데이터 메시지) 등 다양한 기능을 제공단점메시지 전송 및 전달 상태에 대한 세부적인 제어가 제한적 ex) 재시도 로직에 대한 상세한 제어가 어려움FCM은 Google 서비스에 의존적이므로, Google 서비스가 제한된 지역에서는 사용이 어려울 수..
알람 전송 구현 기술의 고민 이번에 우리 팀에서 기획한 프로젝트는 docconneting이라는 의사와의 채팅과 유료 질문이 가능한 프로젝트였다 알람 전송 시나리오채팅 결제가 성공하면 해당 의사에게 알람이 간다등록이 성공하면 해당 카테고리 의사에게 알람이 간다등록이 성공하면 해당 카테고리 의사에게 알람이 간다알람 조회시나리오는 이런식이다!여기서 나는 알람 전송 기능을 담당하게 되어서 알람을 구현하기 위해서 어떤기술을 사용해야 할지 고민을 해보게 됐다 알림 구현 기술들폴링 어떤 값을 확인하거나 갱신하는 과정정기적 폴링(Regular Polling) : 일정한 간격 또는 주기적으로 데이터를 확인하거나 갱신이벤트 기반 폴링(Event-based Polling) : 특정 이벤트가 발생했을 때만 데이터를 확인하거나 갱신 1) 짧은 폴링(Sho..
동적쿼리와 인덱싱 적용하여 성능 개선하기 (+ Like 검색은?) 구현할 기능이번에 구현할 기능은 의사 다건 조회였다.이때 검색 조건은 총 3가지였다.1. 아무 조건없이 그냥 페이징만 적용하여 조회하기2. 의사 전공별로 검색하기3. 의사 이름으로 검색하기3. 의사 이름 + 전공으로 검색하기 인덱스  고려 사항WHERE 에서 OR을 사용할 때는 or 연산자는 비교해야할 ROW가 더 늘어나기 때문에 풀 테이블 스캔이 발생할 확률이 높기에 걸어도 의미가 없을 수 있음복합 인덱스는 카디널리티(중복도)가 높은순에서 낮은순으로 할 것복합 인덱스에 사용되는 컬럼은 가급적 UPDATE가 안되는 값을 선정해야 함 -> 업데이트 되는 순간 인덱스를 무수히 다시 업데이트 하기 때문인덱스는 가급적 테이블 당 3-5개를 넘지 않도록 하는 것이 좋음 첫 번째 고민 : 조건이 3가지나 있기 때문..
컨트롤러 테스트 작성시 주의할 점 기능 구현을 완료한 다음 컨트롤러 부분 테스트 코드를 짜는 중이었다...컨트롤러 부분만 테스트 코드를 짜면 되니까 이제 금방 끝날 줄 알고 행복한 마음으로 룰루랄라 짜고 있던 도중 생각지도 못한 난관에 부딪히게 됐다@WebMvcTest(DoctorController.class)class DoctorControllerTest { @Autowired private MockMvc mockMvc; @MockitoBean private DoctorService doctorService; @Test public void 의사_단건_조회() throws Exception { // given long userId = 1L; String usernam..