상황 현재 제가 진행 중인 프로젝트의 빌드 툴은 Gradle(- Groovy)입니다. 스프링 이니셜라이저로 Gradle 프로젝트를 생성하는 경우 의존성 레포지토리는 이렇게 MavenCentral을 바라보고 있는데요. (build.gradle 에서 확인하실 수 있습니다.) 개발 과정에서 Maven Central 레포지토리가 아닌 다른 레포에서 의존성을 받아와야 하는 상황이 생겼습니다. 해결 의존성을 받아올 호스트 레포지토리의 종류를 확인하고, 다음과 같이 url을 입력해 다시 빌드하면 됩니다. 의존
작년에 호기롭게 시작했던 시리즈인데... 다른 프로젝트로 바빠 방치하다가 최근 비슷한 로직을 다시 구현할 일이 생겨 과정을 다시 정리해봤습니다. 따로 백엔드 서버를 두고 있는 프로젝트이므로 REST 기반으로 로그인을 진행해보겠습니다. 참고로 소셜 로그인 구현은 서버리스로도 가능하지만 과정이 다릅니다. > 이 글에서는 HTTP REST 방식으로 Google 소셜 로그인을 진행하고, 로그인 결과를 바탕으로 서버 단에서 JWT를 발급하는 로직을 설명합니다. 절차 클라이언트 단에서 Google OAuth2 서버에 REST 요청을 보내서 Authorization Code 발급 해당 코드를 이용해 로그인 서버에 회원 정보 요청 받아온 정보를 DB에 저장 (* 본 프로젝트에서는 MySQL 사용) 해당 정보를 통해 JWT를 발급해 클라이언트 응답 헤더에 부착 으로 진행됩니다. 구현 > Spring Boot 3.1.0, Java 17 기준으로 진행합
GDSC Sookmyung에서 Spring Security를 주제로 10분 세미나를 준비하게 되었습니다. 오탈자나 잘못된 정보가 있을 수 있으니 언제든지 제게 알려주세요! Trivia? 한국어로 하찮은 사실들, 여담이라는 의미를 가지고 있다. 얼마 전 캐나다에 어학연수를 다녀왔는데, 영어권 사람들은 이 Trivia라는 것을 굉장히 좋아한다고 느꼈다. 재밌을 것 같아서 주제로 가져와보면 어떨까 싶은 생각이 들었다. Spring Security 스프링의 큰 장점 중 하나는 고수준의 추상화이다. 즉, 내부에는 복잡한 로직이 있지만 우리는 그걸 일일이 다 알 필요가 없다. 그런 스프링의 장점이 많이 녹아있는 프레임워크 중 하나가 바로 스프링 시큐리티다. _스프링 시큐리티란 스프링
나의 두번째 해커톤이 끝났다. 이번 대회에서는 개인적으로 목표했던 것들을 내 힘으로 이뤄낸 것 같아서 좋았고, 무엇보다 수상이라는 가시적인 성과가 있어 기뻤다 🤑 준비 과정과 시행착오들을 복기하며 대회 후기를 기록해본다. 대회 소개 🔗 Notion 대회 공고 국민대학교 소프트웨어융합대학 학회 Koss와 숙명여자대학교 IT공학전공 학회 Code-it에서 개최한 해커톤이다. 2022년 12월 28일부터 국민대학교 미래관 자율주행스튜디오에서 무박 2일간 진행된다. 신청 대상은 아래 학과 소속 재학생으로 제한된다. 국민대학교 소프트웨어
📌 사용자 레벨 관리 기능 추가 구현해야 할 레벨 시스템 사용자의 레벨은 BASIC, SILVER, GOLD 세 가지 중 하나. 처음 가입한 사용자는 BASIC 레벨 가입 후 50회 이상 로그인시 SILVER 레벨 SILVER에서 30번 이상 추천을 받으면 GOLD 레벨 레벨의 변경 작업은 일정 주기마다 일괄적으로 진행 (그때그때 ❌) Level 클래스 추가 각 레벨을 어떻게 저장할 지 생각해보자. 정수형(int)으로 저장하는 방법. ⛔️ 범위를 벗어나는 값이 들어갈 수도 있음 Enum 이용 >🗣 열거형(Enum) ✔️ Java5 이상부터 제공 ✔️ 열거형으로 선언된 순서에 따라 0부터 인덱스 값을 가짐 (순차적으로 증가) ✔️ 열거형으로 지정된 상수들은 모두 대문자로 선언 ✔️ 대표적인 메소드 3개 → values()
📌 초난감 예외처리 나쁜 예외처리 1. 예외를 잡기만 하고 아무런 처리를 하지 않는 경우 예외를 보고도 무시해버리겠다는 태도는 매우 나쁜 태도이다. 특히 자바, 스프링 개발자라면 더더욱 … 한 곳에서 발생한 예외가 캐스케이드되어 다른 곳에서 또 다른 에러를 일으킬 수 있다. 2. 예외 상황을 출력만 해주는 경우 예외가 발생했다는 것을 감지할 수는 있겠으나, 다른 디버깅 로그에 묻혀 놓칠 가능성이 크다. 예외를 처리할 때에 반드시 지켜야 할 핵심 원칙은 딱 하나다. 모든 예외는 적절하게 복구되어야 하며, 그게 아니라면 작업을 중단시키고 개발자에게 분명하게 통보되어야 한다. 3. 의미없는 throws throws Exception 을 쓰면 해당 예외를 무조건 던지게 된다. 하지만 실행 중 발생할 수 있지만 발생하면 안되는 예외와는 분명 구분되어야 한다. 결과적으로 적절한 처리를 통해 복구될 수 있는 예외 상황
무박 2일간 진행됐던 6개 대학 연합 해커톤 유니드톤의 해커톤 트랙으로 참여했다. 수상은 못 했지만 개발 실력 외에도 정말 많은 것을 느끼고 배운 이틀이었던 것 같다. 기억이 날아가기 전에 대회 후기를 기록해본다. 대회 소개 🔗 UniD 공식 웹사이트 🔗 공식 인스타그램 2022년 11월 5일부터 무박 2일간 위워크 서울스퀘어점에서 진행된다. 해커톤 트랙과 데이터톤 트랙으로 나뉘며, 해커톤 트랙에서는 당일 공개되는 주제에 관하여 타대학 팀원들과 협력해 새로운 아이디어를 창출하고 구현한다. 신청 대상은 이하 대학 제1전공생이며, 신청자
Connection Pool > 💬 DB와 미리 연결해놓은 객체들을 받아놓는 웅덩이라는 의미에서 풀이라 한다. DB와의 불필요한 I/O가 감소하므로 성능 향상을 기대할 수 있다. Connection이나 PreparedStatement는 풀 방식으로 운영된다. 미리 정해진 풀 안에 제한된 수의 리소스(Connection, Statement)를 만들어두고, 필요할 때 이를 할당한 뒤 반환하면 다시 풀에 넣는 방식으로 운영된다. 요청이 매우 많은 서버환경에서는 매번 새로운 리소스를 생성하는 대신 미리 만들어둔 리소스를 돌려가며 사용하는 편이 훨씬 유리하지만, 사용한 리소스는 빠르게 반환해야 한다. (풀에 있는 리소스가 전부 고갈되면 문제가 발생하기 때문) → close() 메소드는 사용한 리소스를 풀로 다시 돌려주는 역할을 한다. 실제로 서비스 배포 후 DB 커넥션 풀이 꽉 차서 서버가 중단되는 사례도 있었다고 하니, 대규모 서비스를 구현한다면 놓쳐서는 안될
을 읽고 공부한 내용을 개인적으로 정리한 글입니다. 📌 테스트? 내가 예상하고 의도했던 대로 코드가 정확히 동작하는 지를 확인. 만들어진 코드를 확신할 수 있게 해주고, 변화에 유연하게 대처할 수 있다는 자신감을 준다. 코드의 결함을 탐지해 수정하는 (=디버깅) 과정을 통해 코드의 무결성을 확보할 수 있다. 웹을 통한 DAO 테스트 방법의 문제점 DAO 테스트 과정을 생각해보자. 필요한 모든 웹 계층을 대강이라도 만들어두고, 웹 화면을 띄워 폼에 값을 입력한 뒤 등록 버튼을 누른다. 폼에 입력된 값은 파싱되어 User 객체가 되어 UserDao를 호출한다. 이처럼 단순 웹 기능과는 달리 DAO 테스트를 위해서는 DAO뿐만 아니라 서비스 클래스, 컨트롤러, 뷰 계층 등 모든 레이어의 기능을 다 만들고 나서야 테스트가 가능하다는 문제가 있다. 이 경우 테스트하고 싶은 기능은 DAO에 관한 기
을 읽고 공부한 내용을 개인적으로 정리한 글입니다. 💡 theme 관심사 분리 OoP IoC DI 📌 JDBC Java DataBase Connectivity의 약자. 자바 언어로 데이터베이스 프로그래밍을 하기 위한 라이브러리. JDK에서 DBMS에 종속되지 않는 JDBC API를 제공하며, 각 DBMS 회사에서 제공하는 JDBC 드라이버를 통해 DBMS와 연동하게 된다. 연동 과정 (간단하게만) 자바 상에서 Package 로드 → JDBC 드라이버 on → Connection, Statement 객체 생성 → Query 수행 → 쿼링의 결과로 반환된 Result 객체에서 데이터 추출 → Result, Statemt, Connection 순으로 객체 close 📌 DAO Data Access Object의 약자. 말 그대로 데이터에 접근하는 객체이다. DB 계층과 서비스 계
이 글은 이틀간의 논스탑바보짓밤샘에러해결쇼의 결과물에 대한 기록입니다. 아하하... 힘들고 막막했지만 그래도 해결했으니 되었다~! >제가 진행하고 있는 프로젝트를 기준으로 작성했습니다. 더 나은 로직이 (⚡️얼마든지⚡️) 있을 수 있으므로 참고하는 용으로만 봐주시고, 보완해야 할 점이나 잘못된 부분이 있으면 댓글로 알려주세요! 기재되어 있지 않은 부분에 대해 궁금하신 분은 댓글로 질문해주시면 아는 선에서 답변 드리겠습니다 👍 🗂 패키지 구조 요약 Service 단 회원가입, 로그인 로직을 처리할 AuthService 모든 토큰 발급 및 검증 로직을 처리할 SecurityService Controller 단 회원가입, 로그인 API 엔드포인트와 액션을 정의한 `Aut
코드를 짜면서 수정하거나 보완하면 좋을만한 것들에 대해 메모해둔게 많아서, 아예 글로 과정을 정리해보려 한다. 코드는 이미 잘 짜여진 코드들이 많이 나와있기 때문에, 코드 자체보다는 생각의 흐름을 기록하려 한다. 생각보다 이해하고 공부해야 할 것들이 많아서 중구난방 복잡한 글이 될 수도 있을 것 같지만, 나처럼 막막했던 사람들에게 도움이 되길 바랍니다. (그리고 나중에 내가 쓴 글 다시 보는 거 재밌음 🥴) 참고하면 좋은 글들 한달동안 에러들과 부딪히며 구글링을 많이 했는데, 그중에서도 도움이 많이 됐다 싶은 글들을 모아봤다. 전체적인 로그인 프로세스 정리 Spring Security 와 JWT 겉핥기 세션 로그인과 JWT / 보안 방식에 대한 정리 [🤔 JWT, 정확하게 무엇이고 왜 쓰이는 걸까?](https://velog.io/@junghyeonsu/%ED%
JWT 발행 API를 테스트하던 과정에서, 네트워크 응답 상에는 헤더에 Authorization이 오는데 프론트로 보낸 응답을 콘솔에 찍으면 나타나지 않길래 이유를 찾다가 원인을 발견했다. 💡 헤더 Authorization 항목은 서버 CORS 설정에서 명시해주어야 한다 WebConfig는 서버 측에서 CORS 이슈를 피하기 위해 설정한 Configuration이다. 구글링을 해보며 본 바로는 CorsFilter를 사용하는 경우가 더 많았지만 나는 Configuration에 설정하는게 편해서 이렇게 했다. 여기서 .exposedHeaders(””) 부분을 그냥 “”로 퉁쳐서(?) 해결하려고 했는데, 프론트와 통신을 시켜보니 프론트에서 받아온 response를 콘솔에 찍으면 authorization 항목이 보이지 않는 현상이 발생했다. ![](https://velog.velcdn.com/images/codesusu