웹 프로젝트 (IBAS)

    [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..

    520 Error 해결 (Cloudflare)

    520 Error 해결 (Cloudflare)

    다음과 같은 오류가 발생했다. 갑자기 모든 서브도메인까지 접속이 안되는 상황 발생 서버는 건드리지 않았기 때문에, 클라우드플레어 관련 문제라고 판단. 클라우드 플레어 관련 설정이 변할 수 있는 것은, 저번에 설정해놨던 프록시 서버 주소라고 판단. (프록시 요청 시 원래 사용자 ip 복원하기) 클라우드플레어 레퍼런스와 비교해보니 역시나 변경되어 있었다. 프록시 서버 ip 목록을 최신화 하니 잘 작동한다.

    AWS 비정상적인 디스크 Ops 잡기

    AWS 비정상적인 디스크 Ops 잡기

    상황 aws 비용 명세서를 보는데 위처럼 ebs IOps(input/output operations per second)가 갑자기 엄청나게 늘어났다. 이전달까지는 2백만 IOs 안쪽으로 기록됐는데, 이번달은 6천만 IO가 넘어가서 추가요금이 발생하는 상황이었다. 평소보다 30배 이상 증가한 셈이다. 바로 cloud watch 에서 모니터링 지표를 확인했다. 위에서 볼 수 있듯이, 쓰기 처리량이 5월 초부터 증가했다. 반면 평균 쓰기 크기는 줄었다. 종합하자면, 아주 작은 크기의 디스크 쓰기 작업이 자주 발생하고 있는 상황이다. IO 횟수로 과금되는 EBS 특성상 한번 IO 할 때 데이터를 최대한 모아서 한번에 작업하는 것이 유리한데, 매우 비효율적으로 작동하고 있는 셈이다. 로그성 데이터가 초단위로 쓰여..

    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..