JAVA(SPRINGBOOT) 19

[SPRING SECURITY] 시큐리티 파헤치기 (4) - AUTHENTICATION

DaoAuthenticationProvider 로그인시 username과 password를 제출하면 UsernamePasswordAuthenticationFilter가 Authentication 타입의 UsernamePasswordAuthenticationToken을 만들어 AuthenticationManager에게 전달되고, DaoAuthenticationProvider에게 전달된다. DaoAuthenticationProvider는 token의 username을 이용해 UserDetailsService에게 Userdetails을 요청받고, PasswordEncoder를 통해 UserDetails의 password와 token의 password를 비교한다. 인증에 성공하면 UsernamePasswordA..

JAVA(SPRINGBOOT) 2023.03.23

[SPRING SECURITY] 시큐리티 파헤치기 (3) - AUTHENTICATION

Servlet Authentication Archittecture SecurityContextHolder 누가 인증되었는지에 대한 정보가 저장되는 공간 SpringSecurity 인증의 핵심 SecurityContext를 포함 SpringSecurity는 SecurityContextHolder가 어떻게 채워지는지 신경쓰지않음 값이 저장되어있으면 현재 인증된 User로 사용된다. // Setting SercurityContextHolder SecurityContext context = SecurityContextHolder.createEmptyContext(); Authentication authentication = new TestingAuthenticationToken("username", "passw..

JAVA(SPRINGBOOT) 2023.03.22

[SPRING SECURITY] 시큐리티 파헤치기 (1)

이제껏 로그인/로그아웃은 스프링 시큐리티(Spring Security)를 이용해 구현해왔다. 어플리케이션의 보안은 가장 중요한 부분 중 하나일텐데 얇은(?) 이해를 가지고 기능 구현만 해오고 원리를 정확히 파악하지 않았다. JWT나 OAuth 로그인 기능을 추가할 땐 매번 버벅이며 시간을 허비했다. 그래서 나는 시큐리티를 내가 가능한 범위에서 최대한 파고들어볼 생각이다. 먼저, 내가 지금껏 이해한 로그인 과정은 다음과 같다. 1. client로 부터 username과 password 정보를 받는다. 2. UserDetailsService의 loadUserByUsername을 통해 DB에서 username을 가진 객체를 찾고 존재한다면 UserDetails객체를 생성해 반환한다. 3. 요청 받은 passw..

JAVA(SPRINGBOOT) 2023.03.16

[JPA] PAGEABLE

JPA로 Pageable을 활용한 pagination을 구현하기 위해서는 다음과 같이 Pageable 객체를 인수로 넘겨주면 된다. GET /users?email=test&page=3&size=10&sort=id,DESC 위와 같은 url로 controller에 요청이 오면 페이지에 관련된 정보 (page, size, sort)가 Pageable 객체로 매핑된다. public interface UserRepository extends JpaRepository { List findAllByEmail(String email, Pageable pageable); Page findAllByEmail(String email, Pageable pageable); Slice findAllByEmail(String e..

JAVA(SPRINGBOOT) 2023.03.13

[SPRINGBOOT] 좋아요 수 표현

CRUD 게시판을 구현하며 좋아요 기능을 추가하며 당연하지만, 놓치고 지나간 것을 정리하고자 글을 작성한다. 먼저, 아래는 좋아요 수를 나타내기 위해 처음 작성한 코드이다. @Entity @NoArgsConstructor @Getter public class Post { @Id @GeneratedValue(strategy = GenerationType.AUTO) private long id; @Column private long heartNum; @OneToMany(fetch = FetchType.LAZY, mappedBy = "post", orphanRemoval = true) private List heartList = new ArrayList(); @Builder public Post(String ..

JAVA(SPRINGBOOT) 2023.03.09

[JAVA] VECTOR

Vector란? 자바에서 제공했던 레거시 클래스 Collections 프레임워크가 포함되어 있지 않던 초기 자바 버전에서 정의한 인터페이스 현재는 재구성 및 설게 되어 Collections 프레임워크와 호환 Vector의 특징 필요에 따라 크기를 동적으로 조절할 수 있는 동적배열을 구현 인덱스를 이용해 배열에 액세스 가능 동기화 Vector vs ArrayList ArrayList와 같은 구조를 가지지만, 동기화 여부가 가장 큰 차이점이다. Vector는 동기화되기 때문에 멀티스레드 환경에서 안정성을 가지지만, ArrayList는 그렇지 못하다. 동기화로 인해 Vector에는 하나의 스레드만 접근할 수 있어, ArrayList보다 속도는 느리다. 그렇기 때문에 멀티스레드 환경에서는 ArrayList를 사..

JAVA(SPRINGBOOT) 2023.01.26

[JAVA] GENERIC PROGRAMMING

Generic Class (제네릭 클래스) 타입 파라미터를 한 개 이상 받는 클래스 public class Entry { private K key; private V value; public Entry(K key, V value) { this.key = key; this.value = value; } //Getter } // 제네릭 클래스 객체 생성시 생성자에서 타입 파라미터 생략 가능 // 타입 파라미터에 기본형 타입은 쓸 수 없다. ex) int Enrty enrty = new Enrty("A",3); Genegic Method (제네릭 메서드) 타입 파라미터를 받는 메서드 제네릭 메서드를 선언할 때는 타입 파라미터를 제어자와 반환 타입 사이에 둔다. public class Arrays { publi..

JAVA(SPRINGBOOT) 2022.12.22

[JAVA] 비교연산자 (==, equals)

Primitive Type(기본형)은 실제값을 스텍 메모리에 저장하기 때문에 == 을 이용해서 값을 비교할 수 있다. 하지만 기본형이 아닌 Reference Type(참조형)은 실제값을 저장하는 것이 아니라 주소값을 힙 메모리에 저장한다. 리터럴 방식을 사용하면 String constant pool에 값이 저장되었는지 확인하고 있다면 기존 주소값을 반환, 없으면 새로운 주소값은 반환한다. new 연산자를 이용하면 해당값을 새로운 주소값에 저장하여 주소값을 반환한다. 그렇기 때문에 ==을 통해서 비교하면 주소값을 비교하게되고 실제값이 같다고 해도 false를 반환할 수 있다. equals 메서드를 통해 주소값이 아닌 실제값을 비교해야 기대하는 결과를 얻을 수 있다. String a = "asdf"; //리..

JAVA(SPRINGBOOT) 2022.12.16

[JAVA] REQULAR EXPRESSION(정규 표현식)

정규표현식 문자열 패턴을 지정하여 특정 패턴과 일치하는 문자열을 찾을 때 사용 . 단일 문자 .a.a는 Java와 일치 * 앞에 있는 구문이 0번 이상 반복 be+는 b, be, bee, bee에 일치 + 앞에 있는 구문이 1번 이상 반복 be+는 be, bee, bee에 일치 ? 앞에있는 구문이 선택적 (0번 또는 1번) es?는 e, es에 일치 | 선택 (oo|ee)는 ee나 oo에 일치 ^ 문자의 반전 (지정한 문자 외의 모든 문자) 정규표현식에 문자열이 일치하는지 확인하기 //정적 메서드 Pattern.matches(regex, input); //regex : 정규식, input : 비교할 문자열 //Matcher 생성 Pattern pattern = Pattern.compile(regex); ..

JAVA(SPRINGBOOT) 2022.12.16

[JAVA] EXCEPTION(예외처리)

예외처리의 필요성 오류를 감지하는 과정과 처리하는 과정을 분리함으로써 오류를 감지하고 처리하지 않을 경우를 없앤다. 예외 던지기 public String example(int a, int b) { int c = a - b; return "a가 b보다 " + c + "만큼 더 큽니다."; } 만약 example(1,2)를 호출한다면 올바른 결괏값을 얻을 수 없다. 따라서 예외 처리를 해주어야 한다. if (a b" ); 다음과 같이 throw를 통해 IllegalArgumentException 객체를 던질 수 있다. throw문이 실행되면 정상적인 실행 흐름은 즉시 중단된다. 검사 예외와 비검사 예외 검사 ..

JAVA(SPRINGBOOT) 2022.12.16