프로그래밍 연습하기

스프링 부트와 AWS로 혼자 구현하는 웹 서비스 -5장- 본문

Spring Boot

스프링 부트와 AWS로 혼자 구현하는 웹 서비스 -5장-

john.k 2020. 7. 12. 21:55
반응형

이번 장에서는 스프링 시큐리티와 OAuth2.0을 구현한 구글 로그인, 네이버 로그인과 같은 소셜 로그인 기능을 만들었다.

OAuth2.0을 간단히 정의하면 서로 다른 서비스에서 요청자의 정보를 안전하게 공유할 수 있게 해주는 프로토콜이다.

구글 로그인이나 네이버 로그인과 같은 것들을 사용하면 어디에서 사용자의 정보를 공유한다는 확인 메세지를 볼 수 있다. 이런 서비스가 OAuth2.0을 이용한 서비스이다.


예전에 블로그를 자동으로 작성하는 봇을 만들어 보려고 구글 API를 좀 만져 봤었고,

네이버에서도 단축 URL이라던지 하는 오픈 API를 활용해 보기 위해 계정을 만들고 뭔가 해봤던 때의 생각이 났다.


이번에는 개인 API 키와 같은 개인 정보를 다루기 때문에

설정 파일을 gitignore를 이용해서 github에 업로드 안되게 해야되는데,

올라가버려서 커밋을 취소하다 4장에 작성한 코드를 날려버리는 실수를 했다.

그래서 대충 다시 쳐보면서 너무 양이 많은 부분은 완성된 코드를 복붙하였다.


코드 작성중에 있어서 기존에 만든 User 클래스를 사용하지 않고 새롭게 SessionUser라는 클래스를 만들어서 사용했다.

User 클래스를 사용했더라면 직렬화가 구현되어 있지 않아서 에러가 뜨는데, 그렇다고 해서 직렬화를 구현하면

다른 문제가 생기게 된다.

엔티티 클래스는 다른 엔티티와 관계가 형성될 수 있기 때문에 성능 이슈라던가 부수 효과가 발생할 수 있다.

따라서 직렬화 기능을 가진 세션 Dto를 새롭게 만든 것이다.


같은 코드가 반복되는 부분을 어노테이션 기반으로 개선하는 과정도 있었다.

세션값이 필요할 때마다 직접 세션에서 값을 가져오는 것이 반복되기 때문에 메소드 인자로 바로 받을 수 있도록 개선한다.

어노테이션을 생성하고, HandlerMethodArgumentResolver 인터페이스를 구현한 클래스를 작성하고 그것이 스프링에서 인식 될 수 있도록 WebMvcConfigurer에 추가하는 과정을 거쳐서 개선할 수 있었다.


데이터베이스로 세션 저장소를 바꿨다. 현재는 내장 톰캣의 메모리에 저장되어서 톰캣을 껐다가 키면 모두 초기화된다.

이를 해결하기 위해 다양한 방법이 있는데 간단한 서비스를 만들어가는 과정이므로 데이터베이스를 세션 저장소로 활용하는 방법을 사용했다.

 

데이터베이스를 세션 저장소로 사용하는 것은 간단하지만 성능상 이슈가 발생할 우려가 있다. 이용자가 적고 실제 서비스하기보다는 개발하는 과정이기 때문에 사용하는 것이다.


기존 프로젝트에 시큐리티를 적용하면서 만들어뒀던 테스트도 그것을 고려하여 바꿔줘야한다. 

테스트 환경을 위한 설정값을 만들고, 임의 사용자 인증을 추가하고, 그것을 위해 MockMvc로 바꾸고, 스캔 대상에서 제거하고, JpaAuditing도 분리하는 작업을 거쳐 테스트를 다시 완성할 수 있었다.


저자의 github에 프로젝트가 올라와있고, issue를 통해 에러라던지 오타 등을 확인 할 수 있어서 도움을 많이 받았다.

 

이번에는 좀 많은 에러를 겪었다.

 

대부분이 오타나 뭔가 중간에 빠뜨린 것이 있었다.

그리고 이것은 mustache의 오류?로 보이는 것인데

윈도우에서 username이 환경변수로 지정되어 있는데 mustache에서 이것을 우선적으로 보여준다.

github.com/jojoldu/freelec-springboot2-webservice/issues/169

 

[오류] p.189 userName 표기 관련 · Issue #169 · jojoldu/freelec-springboot2-webservice

기존에 올라온 질문이 아닌지 먼저 검색해주세요! 어떤 오류인가요? 오류설명: 기존에 올라왔지만 해결되지 않은 문제입니다. 세션에 담은 userName의 값이 제대로 표기되지 않는 것입니다. userName

github.com

그래서 username대신 딴 변수를 사용하였다.

 

그리고 뭔가 명확하지 않은 부분도 있었다.

github.com/jojoldu/freelec-springboot2-webservice/issues/192

 

[오류] p.212 기존 테스트에 시큐리티 적용하기 · Issue #192 · jojoldu/freelec-springboot2-webservice

어떤 오류인가요? 오류설명: P.212 전체 테스트를 실행하면 책에는 7건이 실패하는데 저는 4건만 실패하고 나머지는 패스합니다. 왜 책과 다른 결과가 나오는지 찾아 보았는데 제 프로젝트의 main/r

github.com

링크와 같은 내용인 것 같은데, 어떤 분이 올린 답변을 읽어보면 테스트 설정과 관련 된 것 같다.

 

그리고 이 부분은 프로젝트의 issue에서도 찾지 못한 것 같은데, 구글 로그인을 하면 크롬에도 로그인이 되어서 그런건지

게시판에서 로그아웃을 해도 다시 로그인이 되는? 현상을 발견했다.

당장은 해결하지 못했고 나중에 다시 고민해봐야겠다.


시큐리티 코드와 관련된 부분이나 어노테이션을 생성하는 부분이 많이 생소했다.

좀 더 보고 관련된 내용을 공부해야겠다는 생각이 들었다.

반응형
Comments