환경 및 초기 셋팅Kotlin/Spring 환경이며, CORS 정책은 WebMvcConfigurer의 메서드를 오버라이드해서 설정하였다.모든 출처에 대해서 접근을 허용하였다. 운영할 때는 당연히 이처럼 설정하지는 않고, 초기 개발환경에서만 열어둔다.@Configurationclass WebConfig : WebMvcConfigurer { override fun addCorsMappings(registry: CorsRegistry) { registry.addMapping("/**") .allowedOriginPatterns("*") .allowedHeaders("*") .allowedMethods("GET", "POST", "PA..
개요최근 앱 서비스 프로젝트만 하다가, 다시 웹 서비스 프로젝트를 하며 CORS 설정 덕분에 애를 좀 먹었다. CORS 개념을 간단히 정리하고 설정 관련 이슈들을 공유하려고 한다. CORS란?Cross-Origin Resource Sharing의 약자로 동일하지 않은 출처(Cross Origin)의 요청을 허용하는 정책이다.즉 리소스를 요청한 곳의 출처가 서버와 다르더라도 제한적으로 허용하도록 하는 것이다. 출처란?URI의 구성요소 중 Protocol, Host, Port의 조합을 의미한다. https://example.com:8080서버에서 허용한 출처가 다음과 같다고 하자. 아래와 같을 경우 동일하지 않은 출처가 된다.Protocol이 다른 경우 -> http://example.com:8080Ho..
개요객체지향, OOP자바 입문부터 지금까지 정말 많이 들은 키워드들이지만 크게 와닿지는 않았다.하지만 최근에 클린 코드와 클린 아키텍처에 대해서 조금씩 관심을 가지면서 깨달은 것은, 객체지향이 가장 베이스가 된다는 것이였다.관련해서 검색하고 여러 강의들을 보며 공부한 것들을 정리해보려 한다. 왜 객체지향?세상의 모든 소프트웨어가 한 두달 쓰다가 버릴 프로젝트이면 OOP란 개념은 안나왔을지도 모를 것 같다. 하지만 대부분의 서비스들은 기능이 추가되고 유지보수 되며, 리팩토링이 일어난다. 그리고 서비스가 커질수록 조직의 규모도 커지며, 기능을 추가하는 개발자보다 유지보수하는 개발자가 더 많아질 것이다. 이러한 조직에서 가장 중요한 것은 빨리 돌아가는 코드가 아닌, 잘 읽히는 코드이다. 사람의 마인드 구조..
개요운영체제에 대해 확실히 하기 위해 JSCODE에서 주관한 OS 면접 스터디에 참여하였다.오픈 카톡방에서 면접 스터디 모집 공고를 보았고, 퇴사도 한 김에 스터디에 참여하게 되었고, 특히나 많이 약하다고 생각한 파트 중 OS에 대해 공부하기로 하였다.스터디 방식은 1주일에 한 파트씩 공부하며 내용을 정리하고, 모의 면접을 실시하였다. 처음에는 미친듯이 떨렸는데, 마지막에는 조금 떨렸기에 나름 면접에 대한 두려움을 떨쳐낼 수 있었다.성과OS에 대한 전체적인 흐름을 잡을 수 있었다.더 나아가 전공 지식에 대해 어떻게 정리해야 하는지 감을 잡을 수 있었다.면접에서 꼬리물기에 대해 어느정도 경험할 수 있었다.긴장감을 경험하며 어떤 마인드로 어떻게 관리해야 할지 고민할 수 있었다.많은 사람들의 답변을 듣고, 어..
개요프로젝트가 끝나고 팀원과 함께 개선할 쿼리를 추렸다. 최근에 인덱스에 대해 공부하고 있기도 하고 개념적으로만 알고 있던 인덱스를 직접 추가하여 쿼리 성능을 개선 해보았다. 테이블쿼리에 사용된 테이블은 다음과 같다 roomcreate table room_table ( room_id bigint not null, room_meeting_info_id bigint, room_title varchar(255), room_description varchar(255), room_image_url varchar(255), room_head_count integer, ..
개요프로젝트에서 WebSocket을 통해 채팅방을 성공적으로 구현하였다. 하지만 요구사항은 모임에 참여한 사람만 채팅방의 참여가 가능해야하지만, 현재는 채팅방은 누구나 WebSocket을 연결하여 채팅을 송신하거나 수신할 수 있는 상태이다. WebSocket 연결 시, 연결에 대한 인증/인가 로직은 어디다 두어야할지 고민한 흔적을 적어보려 한다. WebSocket 연결 흐름1. WebSocket 연결WebSocket 연결 시, HTTP 연결이 한 번 일어나며 HandShake 과정도 일어난다. 이 과정이 잘 통과되면, 다른 한 쪽의 연결이 끊기기 전까지 양방향 통신이 가능하다 2. Stomp 연결해당 프로젝트에서 Stomp를 이용하여 채팅방을 고도화 하였다. Stomp는 WebSocket 위에서 동..
개요AuthenticationEntryPoint를 통해 인증되지 않은 사용자가 접근할 때에 대한 예외 처리를 하는 것이 목적이었다. 하지만 인증 예외 처리가 일어나지 말아야 할 상황에서도 인증 에러 메시지가 호출 되었다. 해당 과정에서 있었던 트러블 슈팅을 기록하려 한다. 코드CustomAuthenticationEntryPoint@Component@Slf4jpublic class CustomAuthenticationEntryPoint implements AuthenticationEntryPoint { private final ObjectMapper mapper = new ObjectMapper(); private String toJson(ErrorResponse response) thro..
개요프로젝트가 한창이다. 프로젝트하며, 테스트 환경에서 JPA와 관련하여 발생한 이슈에 대해 글로 작성하면 좋을 것 같아 정리하였다. 이슈 1. 더티 체킹 (Dirty Checking)바로 코드로 간다.다음은 예제 코드로 시나리오는 다음과 같다.user 정보를 더티 체킹을 통해 업데이트 한다업데이트가 잘 되었는지 검증한다.@SpringBootTest@AutoConfigureMockMvcpublic class ExampleTest extends TestContainerSupport { @Autowired private UserRepository userRepository; @Autowired private TokenProvider tokenProvider; @Autowired ..
개요최종 프로젝트를 시작하면서, 인증/인가 부분을 한 번 더 맡게 되었다. 이전에는 RefreshToken을 RDB에 관리하며, 'RefreshToken을 Redis에서 관리하는 것이 더 낫지 않을까?'란 느낌이 있었는데, 정확히 어떤 점이 좋은지는 머리 속으로 그려봐도 크게 그려지지는 않았다. 인증/인가 부분을 한 번 더 맡게 된 김에 이번에는 Redis를 이용하여 RefreshToken을 관리해보고, 이전에 잘못 이해했던 RefreshToken 사용 방식을 다시 공부하며 더불어 RDB로 관리할 때의 차이점을 비교해보려 한다. 요구사항함께 살펴볼 부분은 다음과 같다.로그인 시 토큰들을 발급받으며 RefreshToken을 Redis에 저장한다.AccessToken 만료 시 RefreshToken을 통..
개요최근에 캐치 테이블을 타겟 클론하여 프로젝트를 진행하였다.예약 하기 전 해당 시간에 대한 선점을 먼저 요구하는 예약기능의 요구사항이 기억에 남는다. 최근에 이 기능에 대한 로직을 쭉 살펴보다가 개선점이 보였다.기존 로직을 리팩토링 후 글로 남겨본다. 요구사항예약 시, 요구사항은 다음과 같다.가게의 예약시간을 클릭 시, 그 시간에 대해 해당 유저는 7분 동안 예약 선점권을 갖는다.예약 선점권을 가진 유저가 상세정보를 입력 후 예약을 할 수 있다. 기존 코드@Service@RequiredArgsConstructorpublic class MemberReservationService { private final ReservationTimeRepository reservationTimeReposito..