웹 프로젝트 (IBAS)/SpringBoot api 개편

    [Spring Boot] Jpa 테스트 작성 시 영속성 컨텍스트 관련 주의사항

    테스트용 엔티티를 돌려쓰지 말 것! 테스트 코드를 작성하다보면 Mock 객체를 매번 생성해주어야한다. @DataJpaTest 를 통해 트랜잭션 테스트를 진행하다보면 유독 많이 사용되는 객체가 존재한다. 예로 회원서비스는 대부분의 서비스가 의존하고 있기 때문에 회원 엔티티를 Mocking 하는 경우가 아주 많다. 만약 @BeforeAll 과 같은 메서드를 사용하거나, 테스트 클래스 변수 선언을 통해, Member 엔티티를 단 하나 생성하고, 테스트 메서드간 돌려 쓴다면, 테스트가 의도치 않게 실패할 수 있다. 또 테스트가 실행되는 순서에 따라 서로 논리적인 의존성이 발생하기도 한다. 그 이유는 다음과 같다. @DataJpaTest 어노테이션은 내부에 @Transactional 이 붙어서 테스트가 하나 끝나..

    [SpringBoot] 9. OSIV 설정을 통한 쿼리 최적화 방안 고찰

    [SpringBoot] 9. OSIV 설정을 통한 쿼리 최적화 방안 고찰

    [배경] 기존 시큐리티 필터에서는 Role-based access control를 담당하고 있다. [관리자등급 -> 운영진 -> 일반회원] 과 같은 역할기반 접근 제어 말고, 다른 특성으로 권한을 검사해야하는 경우가 있다. 예를 들어, 강의를 개설한 뒤에 강의자만 접근할 수 있는 api 가 있다면 매번 데이터베이스에 쿼리를 날려서 강의자인지 확인하고 인가를 해주어야한다. [문제] 위와 같이 해도 주요 기능은 제대로 수행하고 있지만, 트랜젝션이 2번 실행되는 점을 고려해야한다. 트랜젝션이 끝나면 영속성 컨텍스트에서 관리되던 엔티티들은 detached 되어 다른 트랜젝션이 수행될 때는 다시 db로부터 조회해서 영속화를 또 해주어야하는 중복이 발생한다. 강의실 정보를 수정하기 위한 api를 호출할 때, 강의자..

    [SpringBoot] 8. 하이버네이트 원격서버 암호화 연결 (SSH tunneling 설정)

    [SpringBoot] 8. 하이버네이트 원격서버 암호화 연결 (SSH tunneling 설정)

    [배경] 개발 서버를 따로 운영하고 있다. 따로 로컬에서 db 작업하고 다시 개발서버로 적용하는 일이 번거로워서 애초에 개발서버에서 db 작업 후 바로 적용한다. 기존에는 개발용 데이터베이스를 학교에 두고 사용했다. 근데 종종 전원이 꺼지거나, 랜선이 뽑히는 등의 일이 발생해서 직접 학교에 가서 일일이 작업해야하는 소요가 있었다. 그래서 개발용 db 도 aws로 옮겨버렸다. 하지만 암호화를 사용하지 않고 db 연결해서 사용하면, (예로 3306포트로 다이렉트 연결할 경우) 패킷에 평문이 그대로 노출되기 때문에 종단간 암호화를 해주어야한다. 따라서 ssh tunneling 을 이용해서 공개키 암호화 방식의 프로토콜을 이용하되, aws 상에서 forwarding 을 해주어 db로 연결하도록 했다. [연결 개..

    [SpringBoot] 7. SpringSecurity 인증 모듈 개발 (OAuth2, jwt, 소셜로그인)

    SpringSecurity, OAuth2.0, JWT, Session 등, 까다로운 개념이 많아서 개인적으로는 공부하는데 시간이 꽤 걸렸습니다. 프로젝트를 진행할 때마다 인증 서비스 코드를 작성하는 시간을 줄이면 좋겠다는 생각에 다른 프로젝트를 진행하더라도 언제든지 가져다 쓸 수 있는 인증 모듈을 제작해보고자 했습니다. 확장가능하고 유지보수 가능한 구조에 대해 고민 독립적인 모듈로서의 기능 회원서비스를 의존하지 않도록 하려는 고민 내가 다른 프로젝트를 진행하더라고 바로 가져다 사용할 수 있게끔 하려는 고민 위의 고민들을 통해 완성되었으며 현재는 IBAS 동아리 홈페이지에 적용되어 있습니다. 1. 인증모듈 코드 https://github.com/InhaBas/Inhabas.com-api/tree/dev G..

    DDD, 어그리게이트 분리를 위한 리팩토링

    DDD, 어그리게이트 분리를 위한 리팩토링

    [refactor/#119] DDD를 지키도록 게시글 도메인과 메뉴 도메인 분리 by Dong-Hyeon-Yu · Pull Request #120 · Inha 게시글 엔티티가 메뉴 엔티티를 직접 참조하고 있었는데, 두 개의 어그리게이트를 분리하기 위해서 MenuId 를 참조하도록 함. 단, @EmbeddedId 와 @GeneratedValue 는 동시에 사용할 수 없는 문제가 있음. ( github.com [refactor/#115] DDD 를 지키도록 회원 도메인과 게시판 도메인 분리 by Dong-Hyeon-Yu · Pull Request #117 · Inh 게시판 엔티티가 회원 엔티티를 직접 참조하는 것이 아니라, 회원 엔티티 ID 를 참조하도록 하여, 두 어그리게이트를 분리시킨다. MemberId..

    OAuth2 naver 회원 id 형식 문제 (네아로)

    로컬 개발하는데, 네이버 회원정보 응답이 다음처럼 왔다. { "resultcode" : "00", "message" : "success", "response" : { "id" : "YxvaJNE49NQj-SH9geGSXWKN116r6dIXIqlfU597RS8", "profile_image" : "https://ssl.pstatic.net/static/pwe/address/img_profile.png", "gender" : "M", "email" : "...", "mobile" : "...", "mobile_e164" : "...", "name" : "..." } 기존 db에 있는 response.id 값은 분명 숫자인데, 갑자기 인코딩 된 값이 들어와서 당황했다. 2021년 5월 1일 이후에 만들어진 o..

    [RFC 표준] OAuth 2.0를 쉽고 정확하게 알아보자! (기초 개념 및 용어 정리)

    [RFC 표준] OAuth 2.0를 쉽고 정확하게 알아보자! (기초 개념 및 용어 정리)

    [OAuth 프로토콜이란?] 어떤 회사가 자신의 서비스를 운영하기 위해 어떤 리소스가 필요하다고 가정하자. 근데, 해당 리소스를 처음부터 수집하고 가공하는 일은 노력이 많이들기도 하고, 서비스 사용자에게도 불편한 경험이 될 수 있다. 이 때 구글이나 네이버 같은 대기업에서는 당사에서 미리 만들어 놓은 리소스를 사용할 수 있도록 api 를 공개하는 경우가 있다. 이 때 구글, 네이버 같은 기관은 OAuth provider 라고 말한다. 이 리소스는 민감한 정보(사용자의 개인정보 등)를 포함할 수 있기 때문에 안전하게 미리 약속된 방식으로 데이터를 주고 받을 필요가 있다. 이처럼 에서 HTTP 상으로 정보를 안전하게 주고 받을 수 있도록 통일한 규약을 OAuth 프로토콜이라고 한다. 1. 구성요소 4가지 아..

    [Spring Boot] 4. 로컬 개발을 위한 CORS 설정 - (2) Spring MVC 와 Spring Security

    CORS 정책을 모른다면 아래 글을 먼저 읽으시길 바랍니다. [Spring Boot] 4. 로컬 개발을 위한 CORS 설정 - (1) w3c recommendation 파악 [Spring Boot] 4. 로컬 개발을 위한 CORS 설정 - (1) w3c recommendation 파악 https://fetch.spec.whatwg.org/ Fetch Standard fetch.spec.whatwg.org 프론트 단에서의 비동기 통신 요청 - XMLHttpRequest 객체를 이용한 AJAX(Asynchronous JavaScript And XML (en-US)) 프로그래밍을 용.. letsmakemyselfprogrammer.tistory.com [2가지 설정 방법] CORS 정책 설정은 Spring M..