백엔드 89

[spring boot] - Swagger로 API 문서화하기

💁🏻‍♀️ 나의 상황현직 개발자에게 Swagger UI를 현직에서도 많이 사용한다는 정보를 듣게 되어서, 이번 팀 프로젝트에도 적용해 보기로 마음먹었다! 1. Swagger란 무엇인가?Swagger는 RESTful API를 설계, 구축, 문서화 및 소비하기 위한 오픈 소스 프레임워크이다.Swagger는 API가 어떻게 작동하는지에 대한 명확한 이해를 제공하며, 개발자와 클라이언트 간의 의사소통을 개선하여 API의 품질을 높이는 데 도움을 준다. 2. Spring Boot에서 Swagger 설정하기2.1. 의존성 추가먼저 build.gradle 파일에 Swagger 관련 의존성을 추가한다. Spring Boot 3.x 버전부터는 springdoc-openapi 라이브러리를 사용하는 것이 권장된다.dep..

🚨ERROR - [spring boot] GET 요청 시 406 오류 발생

🏕️ 문제 발생최근 Spring Boot 기반의 웹 애플리케이션에서 GET 요청을 테스트하기 위해 Postman을 사용했다. API 엔드포인트는 특정 사용자의 정보를 반환하는 기능을 가지고 있었고, 요청이 성공적으로 처리되기를 기대했다. 그러나 요청을 전송할 때 HTTP 406 Not Acceptable 오류가 발생했다. 이 오류는 서버가 클라이언트의 요청에 적합한 응답을 제공할 수 없을 때 발생하는 것이다.💦 오류의 원인HTTP 406 오류의 주요 원인은 서버가 요청한 형식으로 응답을 제공할 수 없을 때 발생한다. 클라이언트에서 요청을 보낼 때 Accept 헤더를 통해 원하는 응답 형식을 명시하고, 서버가 이 형식으로 응답하지 않으면 406 오류가 발생한다.  🔑 문제 분석 및 해결 과정문제 해결..

[개발환경] H2 DB 선택과 연결하기

🤷🏻‍♀️고민하기 - 어떤 DB를 사용할 것인가이전 프로젝트에서는 mysql를 사용하기도 했고, 가장 친숙한 느낌이라 mysql을 사용할까도 했지만 스프링 부트를 공부했을 때 test 코드 작성 시에 내장형 db를 사용하면 더 다양한 기능을 자동으로(?) 사용할 수 있었던 것으로 기억해서 이번에는 H2를 활용해 보기로 했다. (추후 mysql로 변경도 가능하기 때문에~)  1. 인메모리 모드데이터가 메모리에만 저장되며, 서버가 종료되면 데이터가 사라진다. 2. 디스크 기반 모드 ✔️데이터가 디스크에 저장되며, 서버를 종료하고 다시 시작해도 데이터는 유지된다.  ✔️ Mac에서 h2에 실행하기터미널에 접속한다.cd 명령어를 활용해 다운받아 놓았던 h2 폴더 ➡️ bin 폴더까지 들어간다.그 상태에서 아..

🚨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 데이터베이스에 여러 프로세스나 스레드에서 동시에 접근하려고 할 때 발생할 수 있다. 데이터베이스가 한 번에 하나의 프로세스나 스레드만 접근할 수 있도록 설계되어 있기 때문에 ..

Test code - MockMvc란?

💟 MockMvc란?MockMvc는 Spring MVC의 웹 계층을 테스트하기 위해 사용되는 도구로, 웹의 컨트롤러를 실제 서버를 시작하지 않고도 테스트할 수 있게 해 준다. 이를 통해 웹 계층의 독립적인 테스트를 할 수 있다. MockMvc를  사용하면 spring mvc의 동작을 Mocking하여 http 응답과 요청을 시뮬레이션할 수 있다. 💟 Mocking이란?모킹은 소프트웨어 테스트에서 특정 객체나 동작을 가짜로 만들어 실제 객체나 동작을 대체하는 기술이다. 이를 통해 독립적이고 격리된 테스트 환경을 구축할 수 있다.  @SpringBootTest // 테스트용 애플리케이션 컨텍스트 생성@AutoConfigureMockMvc // MockMvc 생성 및 자동 구성class TestContro..

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