개요메서드 파라미터에 값이 아닌 어떠한 로직을 넘기고 싶을 경우가 있다면, 어떻게 해야 할까? 인터페이스 구현 후, 구현한 클래스 넘기기public class ExMain { public static void hello(Procedure procedure) { //4. 메서드 실행 procedure.run(); } //1. 인터페이스 구현 static class Dice implements Procedure { @Override public void run() { int randomValue = new Random().nextInt(6) + 1; System.out.println("주사위 = " + ..
개요데이터 삭제 정책이 soft delete라면, 데이터 조회 시 delete 상태 여부를 확인하는 조건을 일일이 넣어주어야 할 것이다.@SQLRestriction 어노테이션을 통해 SQL의 where절에 delete 상태 여부를 체크하는 조건을 넣는 방법을 소개하려 한다. 문제코드를 살펴보자. 먼제 Hospital 엔티티이다.@Entity@Table(name = "hospitals")class Hospital( @Id @GeneratedValue(strategy = GenerationType.IDENTITY) val id: Long? = null, val name: String, ... //삭제가 된 상태라면, 해당 필드에 값 존재 var deletedAt..
개요OneToOne 양방향 관계로 설정한 엔티티에서 의도치 않게 N+1 이슈가 발생하였다. 관련된 개념인 프록시 객체와 즉시 로딩 & 지연 로딩에 대해 정리하고, 이슈를 공유하려 한다. 프록시 객체실제 엔티티 객체 대신 사용되는 가짜 객체이다. 프록시 객체는 엔티티를 상속받고 위임 패턴으로 구현된다. //실제 엔티티//DB 조회 쿼리 발생Member member = em.find(Member.class, member.getId());//프록시 객체//DB 조회 쿼리 발생되지 않음Member proxyMember = em.getReference(Member.class, member2.getId());//이 때, DB 조회 쿼리 발생proxyMember.getName();//다시 한 번 조회할 때는 쿼리 ..
개요최근 영속성 컨텍스트 내에서 flush 시점에 대해 잘못 짚고 있던 부분이 있어서, 영속성 컨텍스트와 flush 시점에 대해서 정리해보고 트러블 슈팅을 공유하려 한다. 엔티티와 생명 주기JPA에서 엔티티는 DB 테이블과 매핑되는 자바 객체를 말한다.엔티티는 다음과 같은 생명 주기를 갖는다. 1. 비영속Member member = new Member();member.setId(100L);member.setName("HelloJPA");엔티티가 처음 만들어졌을 때 상태이다. 2. 영속EntityManager em = emf.createEntityManager();//비영속Member member = new Member();member.setId(100L);member.setName("HelloJPA"..
환경 및 초기 셋팅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 위에서 동..