개발일지 82

[개발]🎁배운점 - 카카오톡 로그인 기능 개발, 사전 조사의 중요성을 깨닫다

🏕️ 상황기본 form 로그인, google OAuth 로그인을 진행한 후에 다른 팀원이 개발한 카카오 로그인 기능을 내가 만든 코드에 합치는 개발을 하게 되었다. 문제는 로그인 후 반환되는 데이터였다. 많은 시간을 투자해 구현한 뒤, 카카오에서 제공하는 사용자 정보는 제가 원했던 것보다 훨씬 제한적이라는 것이다. 성별, 생년월일, 이메일과 같은 정보는 기본적으로 제공되지 않았고, 사용자가 허용해야만 받을 수 있는 정보도 제한적이었다. 디테일한 정보를 받으려면 사업자 등록증과 같은 서류를 가지고 비즈니스 인증을 받아야 한다... 💦 과정문제를 인식하기까지 약 1주일이 걸렸다. 기능을 거의 다 완성한 상태에서야 주어진 데이터가 우리 프로젝트에 필요한 정도에 미치지 못한다는 것을 깨달았다. 여기서 배운 ..

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

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

🚨ERROR - 사용자 인증_500 error 올바르게 처리하기

🌑 문제 발생애플리케이션에서 인증되지 않은(유효하지 않은 토큰이나, 아예 토큰을 넣지 않은 경우) 사용자가 API 요청을 보냈을 때 401 Unauthorized 에러가 발생해야 하지만, 실제로는 500 Internal Server Error가 발생했다. 당장에 문제가 되는 것은 아니지만 상황별로 적절한 오류가 발생해야 프론트와 작업할 때도 문제가 없이 적절히 처리할 수 있을 거 같아서 반드시 해결을 하고 넘어가고 싶었다.  해결을 해봐야 한 걸음 성장할 수 있으니까ㅎㅎ 🌕 해결  -  defaultAuthenticationEntryPointFor 사용.exceptionHandling(exceptionHandling -> exceptionHandling .de..

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

🌑 상황최근 팀 기능을 개발하면서 각 기능별로 보안 설정에 대해 고민해 보게 되었다.특히, API의 보안 설정을 어떻게 관리할지에 대해 여러가지 방법을 검색해 보고 고려하게 되었는데 가장 대표적인(?) API 네이밍 컨벤션과 Spring Security를 활용하는 방법 중에서 고르기로 했다. 🌗 과정API 네이밍 컨벤션가장 먼저 생각이 든건 API 네이밍 컨벤션을 통해 인증이 필요한 경로를 구분 짓고 싶었다.예를 들어, /api/team/secure/** 이런 식으로 인증이 필요한 경로라는 것을 config 파일에 등록하여 직관적으로 표현하는 것이 한눈에 보기 좋다는 생각이 들었다. 하지만 이 방식으로 진행했을 때의 단점은모든 보안 요구상을 경로에 반영하면 복잡해질 위험이 있다.역할별 접근 권한까지 ..

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

[개발] - MapStruct를 사용하여 매핑 구현하기

Spring Boot 애플리케이션에서 엔티티(Entity)와 DTO(Data Transfer Object) 간의 데이터를 변환할 때, 수동으로 변환하는 대신 Mapper를 사용하면 코드의 가독성을 높이고 유지보수를 용이하게 할 수 있다.이를 위해 흔히 사용되는 라이브러리가 MapStruct이다.(이전에는 항상 수동으로 하나하나 엔티티와 DTO를 매핑했었는데 이번에 새롭게 MapStruct를 알게 되어 사용해 보게 되었다.) 🩵 MapStruct란? MapStruct는 자바 애플리케이션에서 객체 간의 매핑을 간편하게 해주는 코드 생성기이다. 컴파일 타임에 매핑 코드를 생성하여 런타임 오류를 줄이고, 매우 효율적인 매핑 구현을 제공한다.Spring Boot와의 통합도 쉽게 이루어지며, 주로 엔티티를 DTO..

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

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

🤦🏻‍♀️고민하기 - [개발환경] 포크 앤드 풀(Fork and Pull) 워크플로우

🫧 나의 상황이전에 다른 프로젝트를 진행할 때는 항상 원격 저장소에서 git clone만 해서 프로젝트를 진행했었다.clone 한 후에 각자의 개발 브랜치를 생성하여 해당 브랜치 안에서만 개발과 merge 등을 했었는데, 이번에는 처음 해보는 방식으로 github를 활용하게 되었다.💡포크 앤 풀(Fork and Pull) 워크플로우란?소프트웨어 개발에서 협업은 필수적이다.특히, 팀 프로젝트에서는 여러 개발자가 함께 작업하는 것이 일반적이고이때, 각자의 작업을 안전하고 효율적으로 관리하기 위해 사용하는 대표적인 협업 방식이 바로 포크 앤드 풀(Fork and Pull) 워크플로우라고 할 수 있다.  1. 팀 깃허브 페이지 생성하기포크 앤드 풀 워크플로우를 시작하기 위해서는 우선 팀 깃허브 페이지를 설정..

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

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

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

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