일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 파이썬
- KPT회고
- jwt
- 개발자 취업
- 99클럽
- 프로그래머스 이중우선순위큐
- infcon 2024
- 디자인 패턴
- 구글 OAuth login
- Spring multimodule
- JavaScript
- 1주일회고
- 커스텀 헤더
- Python
- 빈 조회 2개 이상
- spring batch 5.0
- 디자인패턴
- 빈 충돌
- 단기개발자코스
- jwttoken
- 항해99
- 프로그래머스
- 취업리부트코스
- @FeignClient
- 인프콘 2024
- DesignPattern
- 개발자부트캠프추천
- TiL
- 전략패턴 #StrategyPattern #디자인패턴
- 코딩테스트 준비
- Today
- Total
목록백엔드 with java (24)
m1ndy5's coding blog
JWT 로그인을 공부하고 구현하면서 Refresh Token의 필요성, 저장 위치와 같은 의문점이 들어 정리하는 글이다. Refresh Token이란?JWT 토큰은 사용자의 신원이나 권한의 정보를 담고 있는 토큰이다.따라서 사용자는 이 JWT 토큰을 사용하여 안전하게 통신할 수 있다.하지만 이 토큰의 가장 큰 문제점은 탈취를 당할 수 있다는 것이다!!해커가 토큰을 탈취해 서버에 접근한다면 서버 입장에서는 토큰의 주인이 접근한다고 생각할 것이다.만약 이 토큰에 유효기간이 없다면 해커는 언제고 이 탈취한 토큰을 가지고 멀쩡한 사용자 행세할 것이다!이를 막기 위해 토큰의 유효기간을 짧게 두고, 토큰의 유효기간이 끝나면 Refresh Token을 가지고 새로운 토큰 발행을 요청한다. 동작 과정로그인 성공 -> ..
프론트없이 JWT 토큰을 사용한 로그인을 구현하던 중에 겪었던 문제들과 고민들에 대해서 정리해보려고 한다!일단 기술 스택으로는 Spring boot 3.2, Spring Security 6.2, Spring Gateway 4.1을 사용하였다. 현재 진행하고 있는 프로젝트는 멀티모듈 구조이기 때문에 로그인 후 토큰 발급(인증)은 User Module에서 진행하고, 각 요청의 토큰 검증(인가)은 Gateway Module에서 진행하게 설계했다. 가장 먼저 문제를 겪었던 부분은 로그인이 성공한 후에 SimpleUrlAuthenticationSuccessHandler의 onAuthenticationSuccess 메서드에서 토큰을 발급하고 메인페이지로 리다이렉트해주는 부분이었다.구현하고자 했던 로직은 로그인 성공..
면접에서 String과 StringBuffer의 차이점에 대한 질문을 받았는데 잘 대답하지 못했다ㅜㅜ 정리를 해보자!!! 1. 가변성(Mutability) String String 클래스의 인스턴스는 불변(immutable)입니다. 한 번 생성되면 내부 문자열은 변경될 수 없다. 문자열을 수정하면 새로운 String 객체가 생성된다. StringBuffer StringBuffer은 가변(mutable) 클래스이다. 따라서 문자열의 내용을 변경할 수 있다. 2. 스레드 안전성(Thread Safety) String String 클래스는 스레드 안전(thread-safe)하다. 여러 스레드가 동시에 String 객체에 접근해도 문제가 발생하지 않는다. StringBuffer StringBuffer도 스레드 ..
스프링을 공부하다 보면 Setter 사용하지 마세요라는 말은 귀에 딱지 앉게 들어봤을 것이다. 이제부터 그 이유를 알아보자! 1. 의도를 파악하기 힘듦 member.setName("minsung"); member.setAge(20); setter로 값을 변경하게 됐을 때는 왜 이 값을 변경했는지 setter 코드만 봐서는 유추가 힘들다. 이게 새롭게 값을 넣어주는 것인지, 기존의 값을 바꿔주는 것인지 한눈에 알기 쉽지 않다. 예를 들어보자 public void updateAge(int age){ this.age = age;} setAge보다 더 직관적인 메서드명을 가지고 있다. 이 메서드를 사용한다면 아 기존의 age를 바꿔주는구나라고 더 직관적으로 이해가 가능하다. 2. 객체의 일관성을 유지하기 힘듦 ..
프로젝트를 진행하던 중 궁금한 점이 생겼다. Post라는 게시글 Entity가 가지고 있는 필드는 postId: 포스트 아이디 member : 작성자 title: 게시글 제목 content: 게시글 내용 likes: 좋아요 개수 createDate: 작성 일자 updateDate: 수정 일자 이렇게 가지고 있었다. 이에 따라 게시글을 조회하는 컨트롤러에서 귀찮게 DTO를 만들지 않고 그냥 Post Entity자체를 응답으로 내려줘도 되지 않을까? 라는 생각을 해서 주변 개발자분들께 여쭤봤고 욕을 먹었더라는(?)ㅋㅋㅋㅋㅋ 나와 같은 생각을 가지고 있을 꼬꼬마 개발자분들께 왜 굳이 DTO로 반환하는지에 대한 글을 공유하려고 한다! 일단 글에 들어가기 앞서 DTO가 무엇인지부터 알고 가보자 DTO란? Data..
잠깐 디자인패턴 정리를 쉬고 스프링 MVC 패턴에 대한 인강을 듣다가 어떨 때는 이걸 사용하고 어떨 때는 저걸 사용하고 싶을 때는 어댑터 패턴을 사용해야한다 라는 말이 나와서 먼저 이에 대해 정리해보려고 한다! 어댑터의 역할 예를 들어 국내에서 쓰던 충전기를 일본에가서 사용하려고 하면 당연히 호환이 안될 것이다. 이때 어댑터를 사용하여 맞춰준 경험이 있을 것이다! 어댑터는 특정 인터페이스를 클라이언트에서 요구하는 형태로 적응시키는 역할을 한다. 객체지향 어댑터 어떤 소프트웨어 시스템에 새로운 업체에서 제공한 클래스 라이브러리를 사용해야 하는데 그 업체에서 사용하는 인터페이스가 기존에 사용하던 인터페이스와 다르다고 가정해 보자 그렇지만 기존 코드를 바꿔서 이 문제를 해결하기엔 일이 너무 복잡해지기 때문에 ..
람다식은 함수형 프로그래밍 기법을 지원하는 자바의 문법 요소 자바에서 메서드를 사용하려면 항상 클래스 객체를 먼저 생성한 후 생성한 객체로 메서드를 호출해야 한다. 이를 해결하기 위해 나온 방법이 람다식이다. 단 하나의 추상 메서드만을 포함하는 인터페이스를 함수형 인터페이스라고 하고, 이 함수형 인터페이스의 호출 및 기능을 구현하는 방법을 새롭게 정의한 문법이 바로 람다식이다. 정리하자면 람다식은 기존의 객체 지향 프로그램 체계 안에서 함수형 프로그래밍을 가능하게 하는 기법이라고 생각할 수 있다. 객체 지향 구조 내에서 람다식 적용 과정 interface A { void abc(); } class B implements A { public void abc(){...} } // 사용할 때 A a = new..
... 증말 이 문제로 몇시간은 헤맨 것같다,,,ㅎ 문제의 시작부터 차근 차근 따라가보자,,,, 먼저 프로젝트에는 2가지의 @Configuration 파일이 있었다. package hello.core; import hello.core.discount.DiscountPolicy; import hello.core.discount.FixDisscountPolicy; import hello.core.discount.RateDiscountPolicy; import hello.core.member.MemberRepository; import hello.core.member.MemberService; import hello.core.member.MemberServiceImpl; import hello.core.mem..
싱글톤 정의 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴하는 것 즉 인스턴스가 오직 한개라는 뜻이다. 고전적인 싱글톤 패턴 구현 public class Singleton{ private static Singleton uniqueInstance; private Singleton(){} public static Singleton getInstance(){ if (uniqueInstance == null){ uniqueInstance = new Singleton(); } return uniqueInstance; } }생성자를 private로 선언해 외부에서 인스턴스 생성을 막고 static 변수로 Singleton을 선언..
추상 팩토리 패턴 정의 연관성이 있는 객체 군이 여러개 있을 경우 이들을 묶어 추상화하고, 어떤 구체적인 상황이 주어지면 팩토리 객체에서 집합으로 묶은 객체 군을 구현화 하는 생성 패턴 -> 다양한 구성 요소 별로 '객체의 집합'을 생성해야 할 때 유용 원재료 팩토리 만들기 피자를 만들 때 들어가는 토핑이 조금씩 다르다고 생각해보자. 일단 각 재료를 공급하는 Factory를 만들어보자 public interface PizzaIngredientFactory{ public Dough createDough(); public Sauce createSauce(); public Cheese createCheese(); public Veggies[] createVeggies(); }이 안의 메소드를 전..