개발자 60

🤦🏻‍♀️고민하기 - Spring Security_API 경로에 따른 인증 및 역할 관리(2)

🌑 상황1. 아래의 블로그를 보면 알 수 있듯이 API 네이밍 컨벤션 말고, 새로 알게 된 @PreAuthorize, @PostAuthorize을 써보기로 했는데 Swagger UI까지 사용하다보니 Controller에 있는 메서드 상단에 붙어있는 어노테이션들이(아래의 사진처럼) 너무 많아지니까 불안(?)해졌다. 코드는 깔끔하고, 한눈에 보기 좋은 것이 미덕이라고 알고 있는데 부피가 커지는 것에 대한 막연한 걱정이 생긴 것이다. 그래서 API 경로(인증이 필요 있는 API와 필요 없는 API의 구분)에 따른 인증 방법에 대해서 "다시"고민해보았다. 2. 그리고 API 경로 자체도 딱! 규칙을 정해서 일관되게 하고 싶은데, controller마다 제각각인 느낌이라 이 부분도 확실히 잡고 넘어가려고 한다~..

🚨ERROR -org.springframework.jdbc.datasource.init.CannotReadScriptException: Cannot read SQL script from class path resource

🏕️ 상황@Sql("/insert-members.sql") @Test void getAllMembers() { // when List members = memberRepository.findAll(); // then assertThat(members.size()).isEqualTo(3); }위에 있는 코드를 실행하려면 [insert-member.sql]를 읽어와야 하는데 해당 파일을 찾을 수가 없어서 오류가 계~~~~속 발생했다. 💦 과정이 오류를 해결하기 위해서 3시간 넘게 쓰면서 아래에 있는 방법들 + α 를 시도해보았다. 1. 혹시 모르니 설정 파일에 전체 코드에 대한 로그 레벨을 설정해 보기2. build.gradle 파일에서 ..

🚨ERROR - [spring boot] org.springframework.beans.factory.UnsatisfiedDependencyException:

🏕️상황테스트 코드를 작성하고 run을 했는데 위와 같은 오류가 발생했다. 거의 처음 보는 오류였는데 알아보니Spring Boot가 테스트를 실행할 때 내장형 데이터베이스를 사용하려고 시도하지만, 프로젝트의 클래스패스에 해당 데이터베이스에 필요한 라이브러리가 없어서 발생한 문제였다. mysql은 내장형 데이터베이스가 아니다. 이 사실을 모르고 mysql을 사용해서 개발하고 있었다.왜냐하면 이전 프로젝트에서도 mysql을 사용했기 때문에 mysql의 환경세팅이 나에게는 더 편했기 때문이다.그래서 내장형 db 라이브러리도 내 프로젝트에는 없었다 :) 💦과정mysql ➡️ H2로 교체했더니 오류 해결!! 원래대로라면 DB만 바꿔주면 바로 해결될 문제였지만 나는 2가지의 오류를 만나면서 거의 3시간을 소모했..

🚨ERROR - Exception in thread "main" org.h2.jdbc.JdbcSQLException: Database may be already in use:

🏕️상황Exception in thread "main" org.h2.jdbc.JdbcSQLException: Database may be already in use: "Locked by another process". Possible solutions: close all other connection(s); use the server mode [90020-161]H2 데이터베이스에 접속하려고 시도하는데 위와 같은 오류가 발생했다. (오류 고칠 생각에 실제 화면은 캡처하지 못했다..) 원인은 크게 2가지이다.동시 접근: 동일한 H2 데이터베이스에 여러 프로세스나 스레드에서 동시에 접근하려고 할 때 발생할 수 있다. 데이터베이스가 한 번에 하나의 프로세스나 스레드만 접근할 수 있도록 설계되어 있기 때문에 ..

[11강] 네이버 로그인 완료

🤍[네이버 개발자 사이트]에 들어가서 다음과 같이 진행하여 id와 비밀번호를 발급받아 준다. 🤍앞서 진행한 것과 마찬가지로 해당 값을 각각 코드에 넣어준다. # naver OAuth2 설정 spring.security.oauth2.client.registration.naver.client-id=vFzQdx0GIL_gWvfx9i1k spring.security.oauth2.client.registration.naver.client-secret=[비밀번호 값] spring.security.oauth2.client.registration.naver.scope=email,profile spring.security.oauth2.client.registration.naver.client-name=Naver spri..

[10강] 페이스북 로그인 완료

🤍받은 인증 정보들을 코드에 기입해 주기 색깔에 맞춰서 각각 정보들을 기입해 주면 된다. 🤍oauth에서 제공하는 규격에 맞게 요청 url을 작성한다. OAuth2 클라이언트 애플리케이션에서 정의한 OAuth2 공급자(여기서는 Facebook)에 대한 인증을 시작하라는 요청을 나타내는 것이다!! ( OAuth2 클라이언트의 구성에 따라 "facebook" 부분이 다른 OAuth2 공급자 이름으로 대체될 수 있다.) 🤍1차 테스트(?)로 요청을 해본다...!! (성공) 로그인을 하고 나면 다음 사진에 있는 과정을 거치게 된다. (이 강의 이전에 작성해 놓은 코드가 작동을 하는 것이다 - oauth 로그인에 대한 처리를 다 해놓았기 때문에 바로 기본적인 정보가 따라온다.) 핑크색 박스의 내용을 보면 face..

[9강] 구글 로그인 및 자동 회원가입 진행 완료

@Data public class PrincipalDetails implements UserDetails, OAuth2User { private User user; //해당 user의 권한을 리턴하는 곳!! private Map attribute; //OAuth2 인증 시 사용자의 속성 정보를 저장하기 위해 선언된 필드 // 일반 로그인 때 사용하는 생성자 public PrincipalDetails(User user){ this.user = user; } //OAuth를 사용하여 로그인하는 생성자 public PrincipalDetails(User user, Map attribute){ this.user = user; this.attribute = attribute; } @Override public C..

🤦🏻‍♀️고민하기 - 중복되는 코드 리팩토링 - 피드백 게시판 CRUD

🏕️상황게시판의 형식으로 (개발 관련해서) 웹 사이트의 오류, 개선사항, 에러 발견 등의 사항들을 올릴 수 있도록 개발하는 것이 목표였다.게시글에 대한 권한 부여를 어떻게 구현할 것인지 살짝 고민이 되었지만 spring security를 사용하지 않아도 복잡하거나 어렵지 않게 구현할 수 있을 거 같아 일단은 단편적인 방법으로 구현하기로 했다.기능 개발을 다 하고 보니 여러 메서드들에 공통적으로 사용되는 부분이 있었고, 그걸 보니 최근에 배운 내용이 생각났다. (아래와 같은) 🔽공통적으로 사용되는 부분은 끄집어 내서 따로 정의한다. ⭐리팩토링 전 코드@Servicepublic class feedbackService { @Autowired private feedbackRepository rep..

[java] Optional - Optional의 매핑 메소드

🏕️상황 Optional을 사용해야 하는 상황에서 코드를 좀 더 간결하게 하고자 하는 방법을 찾다가 발견한 것이 Optional의 map 함수였다. map 함수라고 하면 java 컬렉션의 map 함수만 생각이 나서 의아했다... '그 map 함수가 optional에서도 연산을 수행하나...?'라는 생각이 들었다. 알아보니 optional 객체의 map() 함수가 따로 존재했던 것이다!!! 그래서 오늘은 아래의 주제에 대해 알아보려고 한다. Optional의 매핑 메소드 optional의 매핑 메서드는 map() 및 flatMap() 이렇게 두개의 주요 메소드를 포함한다. 이러한 메소드를 사용해서 Optional 안의 값을 변환하거나 매핑할 수 있다. 💚map() 메소드 Optional 안의 값을 변환하려..

[8강] Authentication 객체가 가질 수 있는 2가지 타입

로그인 방식은 2가지가 있다. 일반 로그인 aouth 로그인 > 일반로그인으로 접근하려면 controller에서 @AuthenticationPrincipal PrincipalDetails userDetails > 구글로그인으로 접근하려면 controller에서 @AuthenticationPrincipal OAuth2User oauth => 일반 로그인은 PrincipalDetails 에서 유저 정보를 가지고 오는 것이고, oauth 로그인에서는 OAuth2User에서 유저의 정보를 가지고 오는 것이다. 이처럼 서로 다른 두 로그인 방식에 접근하기 위해서 서로 다른 방식을 사용해야한다, 🗝️해결 기존 PrincipalDetails 클래스는 1) 아래처럼 UserDetails만 구현하는 상태였지만 2) 추가..