[DNS] 가비아 도메인으로 Vercel 홈페이지 배포 시 SSL 인증서 만료 해결

상황 최근, Vercel을 활용해서 배포한 홈페이지에서 SSL 인증서 만료 관련 문구가 발생했습니다. 인증서 만료일자가 오늘 이전이라 크롬으로 홈페이지 접속이 거부되었습니다. 원래 Vercel에서 자동으로 인증서를 갱신하게 되어있는데, 갱신되지 않아서 만료가 되었습니다. 원인 위 페이지 하단에서 다음과 같은 문구를 발견할 수 있었습니다. 도메인 설정이 잘못되면, 갱신이 되지 않을 수 있습니다. 도메인이 잘못 구성되어 있으면 인증서가 갱신되지 않을 가능성이 높습니다. 도메인의 구성 상태를 확인하려면 프로젝트 설정(Project settings)으로 이동한 후 도메인 섹션(Domains section)으로 이동하면 됩니다. ...

2024. 11. 20. · 2 분 · 383 단어 · Leaf

[Java] JPA detached entity passed to persist 오류 해결하기

상황 JPA를 사용해서 엔티티를 저장하는 로직에서 종종 발생하는 오류입니다. 저는 DataJpaTest를 작성하다가 em.persist(member) 메서드를 실행하면 발생했습니다. 오류 메시지 detached entity passed to persist오류 메시지는 다음과 같습니다. detached entity passed to persist: pull_up.infra.database.entity.Member jakarta.persistence.EntityExistsException: detached entity passed to persist: pull_up.infra.database.entity.Member at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:126) at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:167) at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:173) at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:763) at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:741) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:569) at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:319) at jdk.proxy3/jdk.proxy3.$Proxy148.persist(Unknown Source) at pull_up.global.entity.BaseEntityTest.testCreateAt(BaseEntityTest.java:35) at java.base/java.lang.reflect.Method.invoke(Method.java:569) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) Caused by: org.hibernate.PersistentObjectException: detached entity passed to persist: pull_up.infra.database.entity.Member at org.hibernate.event.internal.DefaultPersistEventListener.persist(DefaultPersistEventListener.java:88) at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:77) at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:54) at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:127) at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:757) ... 11 more 해석하기 오류 메시지(detached entity passed to persist)를 그대로 해석하면 다음과 같습니다. ...

2024. 11. 18. · 3 분 · 485 단어 · Leaf

[Java]String에서 공백 제거하기

공백 제거의 필요성 자바로 웹개발을 하다 보면, 입력값에 들어온 공백(White space)을 제거해야 할 일이 심심치 않게 있습니다. 특히, UTF-8에는 다음과 같은 다양한 공백이 있기 때문에 모든 경우의 수에 대응해야 합니다. U+0020 : 일반 스페이스 U+0009 : 탭(\t) U+000A : 줄 바꿈(\n) U+000D : 캐리지 리턴(\r) U+000C : 폼 피드(\f) U+3000 : 넓은 공백 공백 제거하기 String.trim() JDK 1.0부터 존재한 역사가 있는 메서드로, 문자열 앞뒤의 아스키 공백1을 내부 char배열에서 제거합니다. 문자열 가운데는 제거하지 않으며, 나머지 유니코드 공백도 제거하지 않습니다. ...

2024. 11. 16. · 2 분 · 306 단어 · Leaf

JPA Cascade vs Orphan Removal

개요 프로젝트를 하던 중, 엔티티 연관관계에서 cascade를 잘못 사용하여 잘못된 엔티티가 삭제되었고, 테스트가 실패하는 상황이 발생했습니다. 동일한 실수를 반복하지 않도록, 이번 기회에 JPA Cascade 개념과 Orphan Removal과는 어떠한 차이가 있는지 확인해보겠습니다. JPA(Hibernate) Cascade 먼저 Java EE 6의 가이드에는 다음과 같이 명시되어 있습니다. Java EE6 가이드의 CASCADE 설명 설명을 읽어보면 Cascade는 영속성 컨텍스트(Persistence Context)에 부모(Cascade옵션을 작성하는 엔티티)가 특정 작업을 수행할 때, 연관된 엔티티(이후 자식이라고 하겠습니다)도 같은 작업을 수행해야 함을 명시하고 있습니다. ...

2024. 5. 13. · 7 분 · 1288 단어 · Leaf

MockMvc Object mapper nested class utf-8 인코딩 오류 해결하기

상황 Controller 테스트 작성 시 mockMvc의 결과가 원하는 값과 일치하는지 확인하는 상황입니다. @Test @DisplayName("[인수] 읽지 않은 알림 요청 시 전체응답(200)") void testAllNotifications200() throws Exception { // given Cookie[] followingUserLoginCookie = mockMvc.perform(get("/api/users/login").header(HttpHeaders.AUTHORIZATION, "Bearer valid_token_2")).andReturn().getResponse().getCookies(); Cookie[] myLoginCookie = mockMvc.perform(get("/api/users/login").header(HttpHeaders.AUTHORIZATION, "Bearer valid_token")).andReturn().getResponse().getCookies(); // when // following -> user 팔로우 mockMvc.perform(post("/api/users/" + me.getId() + "/follows").cookie(followingUserLoginCookie)); // notifications 전체 조회 String responseBody = mockMvc.perform(get("/api/users/notifications").cookie(myLoginCookie)) .andExpect(status().is(200)).andReturn().getResponse().getContentAsString(); ListDto<List<NotificationDto>> notificationDtos = objectMapper.readValue(responseBody, new TypeReference<ListDto<List<NotificationDto>>>() {}); // then assertThat(notificationDtos.getList()).hasSize(1); assertThat(notificationDtos.getList().get(0).getDescription()).isEqualTo("leaf2님이 당신을 팔로우합니다."); } 테스트 결과 junit 테스트 결과(실패) ...

2024. 5. 7. · 2 분 · 222 단어 · Leaf