전체 글
-
연관관계 주인 mappedBy 끝내기spring/JPA 2021. 5. 5. 12:49
배경 cascade 옵션을 공부하면서 양방향 연관관계에서 mappedBy개념을 정리했지만 매번 헷갈린다. 예제를 작성하며 완전히 알고 넘어가보자! 개념 RDB는 양방향 연관관계라는 개념이 없다. 단지 한 테이블이 연관테이블의 FK를 가질 뿐이다. FK는 두 테이블 중 한 테이블만 갖고 있다. 반면 JPA는 양방향 연관관계라는 개념이 있다. 이는 레코드를 객체처럼 관리하기 위함이다. RDB는 조인을 이용해 언제든지 다른 테이블을 참조할 수 있지만 상대 객체의 정보가 없는 객체는 연관 객체를 참조할 수 없다는 점을 보완한 것이다. 엔티티를 설계하면서 연관된 두 엔티티를 단방향으로 설계했다면 딱히 문제될 건 없다. 실제로 양방향보다 단방향으로 관계를 갖는 게 자연스러운 경우가 많다. 그럼에도 양방향으로 관계를..
-
BeanUtils copyProperties 사용법 및 주의사항java 2021. 5. 4. 17:31
배경 DTO를 엔티티로 전환하는 작업 또는 엔티티를 DTO를 전환하는 작업은 흔하게 있다. 두 객체의 필드변수는 많이 닮아 있다. 대부분 공통필드를 갖고 몇몇이 추가되거나 삭제되어 있다. 이때 엔티티 또는 DTO의 필드변수 개수가 많아지면 굉장히 곤란했다. 곤란했다기보다 스트레스를 많이 받았다. 뻔한 코드를 수십줄 치고 있자니 굉장히 어려웠다. 문제는 변경에 있다. 전달해야할 필드가 변경된다면 일일이 찾아서 고쳐야 했다. 그러던 중 굉장한 스프링의 유틸을 발견했다... 사용법 굉장히 간단하다. 복사 소스는 Setter를 정의하고 타겟은 Getter를 정의하면 된다. 그리고 두 인스턴스를 전달하면 이름과 타입이 같은 필드를 getter와 setter를 이용해 복사한다. 복사를 원하지 않는 필드는 위처럼 필..
-
java 실행과정java 2021. 5. 1. 17:46
배경 운영체제 시간에 .c파일이 컴파일, 링크, 로드를 거쳐 실행되는 흐름을 배웠다. java를 본격적으로 공부하면서 대강 비슷하게 실행되겠거니 하고 자세한 내용은 공부를 미뤘다. 이제 면접을 준비해야 하니 자세하게 공부하자^^ JVM이란? JVM은 우리가 작성한 .java파일을 실행하기 위한 소프트웨어다. JVM 또한 하나의 소프트웨어이기 때문에 운영체제에 맞는 버전이 있다. 개발자는 정해진 java문법에 맞게 코드를 작성하고 이를 운영체제와 상호작용하여 프로그램을 실행시켜주는 건 JVM이 해주는 것이다! JVM 동작 과정(큰그림) - 문법에 맞는 .java파일을 작성한다 - Javac는 .java파일을 .class파일로 컴파일한다(텍스트를 바이트코드로 변환한다) - .class파일을 실행한다(.cla..
-
JPA 다른 모듈에서 ENTITY 스캔하기spring/JPA 2021. 4. 29. 08:59
배경 마이크로 서비스를 구축하면서 서비스와 서비스를 연결할 때 공통으로 필요한 코드는 모듈로 분리했다. 일명 라이브러리모듈로서 main은 없고 적절히 import만 할 수 있게 만든 것이다. 이러면 공통적으로 사용하는 코드를 한 모듈에서 관리하니 유지보수성이 크게 올라간다. 그렇다면 어떤 코드가 이 라이브러리모듈에 들어가야 할까? 아직 노하우가 많지 않아 정확한 판단을 하기는 어렵지만 작은 경험으로 추측해보았다. 먼저 DTO 같은 경우 큰 논란 없이 라이브러리모듈에 들어가도 될 것 같다. 다음으로 @Entity애노테이션이 붙은 도메인클래스를 생각해봤다. 한 서비스에서 하나의 도메인만 다루더라도 연관관계가 얽혀 있다면 다른 도메인이 필요할 것이다. 결국 완성된 데이터는 한 서비스에서 조립되어 전달되니 도메..
-
Spring Cloud Gatewayspring/cloud 2021. 4. 28. 17:33
배경 클라이언트가 서비스A를 이용하기 위해 요청을 보낼 때 어떻게 처리해야할까? 서비스A의 IP 또는 URL로 HTTP 통신을 하면 된다. 다만, 서비스A가 동일한 서비스를 제공하는 서로 다른 IP를 가진 클러스터로 있다면 어떡할까? 매 요청마다 서비스A의 클러스터 중 어떤 서비스IP를 이용할지 결정하는 알고리즘이 필요할 것이다. 이 방식은 클라이언트와 서버의 의존도를 높이게 되고 각 서버를 마이크로 단위로 보기 힘들게 한다. 이러한 둘 간의 의존도를 낮춰줄 서버가 gateway서버다. 클라이언트는 서비스A의 물리적인 IP에 의존하지 않고 단지 논리적인 서비스A를 게이트웨이에 요청한다. 그럼 실제 어떤 IP로 서비스A를 요청할지 결정하는 건 gateway서버가 되는 것이다! 초간단 설정 의존성 추가 ap..
-
Spring Cloud Config Server 구축spring/cloud 2021. 4. 28. 16:11
배경 애플리케이션에서 설정정보라하면 배포 환경마다 달라질 수 있는 모든 값이다. 12factor에 따르면 이러한 설정정보는 코드에서 분리하여 따로 관리하길 권장하고 있다. 코드에 종속된 설정정보라면 설정정보 변경 시 전체코드 재빌드가 필요하니 유지보수성이 떨어진다. 이를 극복하기 위해 각 프로젝트마다 application.yml을 따로 두어 설정 정보를 관리하면 하드코딩으로 설정정보를 입력하는 것보다 훨씬 유지보수성이 좋아질 것이다. 다만, 이러한 방식은 한 애플리케이션에서 관리해야할 프로젝트가 여럿인 경우에 유지보수성이 떨어지게 된다. spring cloud config를 이용하면 config자체도 하나의 서버로써 설정정보를 동적으로 바꾸고 관리할 수 있다. 또한 각 프로젝트 내에서 설정 정보를 관리하..
-
Spring boot 2.x 와 Spring security Oauth2 연동spring/security 2021. 4. 21. 20:05
배경 진행 중인 프로젝트는 SSO(Single Sign On) 방식을 지원하지 않는다. 어떤 사용자든 서비스를 이용하기 위해서 신규회원으로 가입해야 한다. 네이버 로그인을 지원해 사용자의 편의성을 높여보자. docs.spring.io/spring-security/site/docs/current/reference/html5/#oauth2login-sample-boot 위 내용을 참고 및 공부하는 내용이다. 큰 그림 - 유저는(Resource Owner) 서비스서버에게(Client) OAuth2.0방식 로그인을 요청한다. - 서비스서버는 유저를 몇몇 정보와 함께 인증서버로(Service API) 리다이렉트한다. - 유저는 인증서버에서 인증을 진행한다. - 인증서버는 유저를 서비스서버의 callbackURL로..
-
JWT를 이용한 인증java 2021. 4. 16. 13:42
배경 진행하는 프로젝트는 인증, 인가를 위해 Session-Cookie방식을 사용하고 있다. 인증 프로세스를 통과한 사용자에게 인증된 쿠키를 응답헤더에 포함하고 그 쿠키를 key값으로 사용자 정보를 세션 형태로 저장한다. 이후 인증된 사용자에게 제공하는 api서비스는 전부 쿠키의 key값에 대한 value가 있는지 확인함으로써 인증을 시도한다. 새로운 마이크로 서비스를 공부하면서 강의 내용은 인증 인가를 위해 JWT를 사용했다. 사실 JWT방식은 많이 들어보기도 했고 현대 아키텍처에서 자주 쓰인다고도 한다. 이번 기회에 명확하게 그 방법을 알아보자. Session-Cookie와 JWT의 차이점 두 방법 모두 HTTP의 stateless를 극복하기 위해 헤더에 값을 저장한다. 다만, Session-Cook..