[Spring Security] 유저 정의와 관리
·
Backend/Spring Security
UserDetailsService, UserDetailsManagerloadUserByUsername인터페이스 내부에 loadUserByUsername이라는 추상 메소드가 존재합니다. 보편적인 인증 작업을 생각해보면 가장 먼저 데이터베이스에 저장되어 있는 유저 세부 정보 및 브라우저에 입력된 유저의 세부 정보를 불러오는 것입니다. 이를 위해 loadUserByusername이라는 추상 메서드가 존재합니다. 여기서 우리는 의문을 가질 수 있습니다.왜 데이터베이스에서 유저 이름만 불러오는가?유저 이름과 비밀번호를 둘 다 비교하는 것이 좋지 않은가?이유는 바로, 비밀번호를 불필요하게 네트워크로 전송하면 안되기 때문입니다. 보안 문제에 취약하므로, 먼저 유저 이름을 사용하여 유저 세부 정보를 로드하고, 나중에 ..
Effective Java - 객체 생성과 파괴 item01
·
Backend/Java
정적 펙토리 메서드정적 팩토리 메서드는 객체 생성의 역할을 하는 클래스 메서드라고 생각하면 된다.  장점 1. 이름을 가질 수 있다. 즉, 생성 목적에 대한 이름 표현이 가능한 것이다. 단순히 생성자의 역할을 대신 이행하는 것 뿐만 아니라 개발자가 좀 더 가독성 좋은 코드를 작성하고 객체 지향적으로 프로그래밍할 수 있게 도와준다.지금까지 클래스를 설계할 때 다양한 타입의 객체를 생성하기 위해 생성 목적에 따라 생성자를 오버로딩하여 구분하여 사용해왔다. 하지만, new 키워드를 사용하려면 개발자는 해당 생성자의 인자 순서와 내부 구조를 알고 있어야 목적에 맞게 객체를 생성할 수가 있다는 번거로움이 있다. 따라서 정적 메서드를 통해 적절한 메서드 네이밍을 해준다면 반환될 객체의 특성을 한번에 유추할 수 있고..
[Java] Java Application이 32bit 또는 64bit JVM에서 실행 중인지 여부 판별하기
·
Backend/Java
Java에 대해서 천천히 공부 중이다. 알고리즘 문제를 풀기 위해서, 개발을 위해서, 학교 수업을 위해서 어떤 문법으로 어떤 기능을 개발할 것이냐에 초점을 두고 공부해왔다. JVM이 어떻게 돌아가는 지, Java API가 제공하는 기능들이 무엇인지도 모르면서...!  하나씩 차근차근 이해하고 공부하자.  public class Main { public static void main(String[] args) { // We can use the “sun.arch.data.model” system property to identify JVM bitness: String jvmBit = System.getProperty("sun.arch.data.model"); if..
Junit5 Controller Test Mockmvc 기본 사용 방법 (get, post, delete, patch)
·
Backend/Junit5
Controller SpringBoot에서 JUnit5를 사용하여 테스트 코드를 작성할 때, @SpringBootTest 어노테이션을 자주 쓰는데, 상황에 따라 @WebMvcTest를 쓰는게 좋을 떄도 있다. @SpringBootTest는 프로젝트의 전체 컨텍스트를 로드하여 빈을 주입하기 때문에 속도가 느리고, 통합 테스트를 할 때 많이 사용한다. 필요한 빈만 등록하여 테스트를 진행하고자 한다면, 슬라이스 테스트 어노테이션인 @WebMvcTest를 사용하는 것이 효율적이다. 슬라이스 테스트란? 특정 부분만 테스트할 수 있는 테스트를 말한다. 아래는 대표적인 슬라이스 테스트 어노테이션이다. @WebMvcTest - Controller를 테스트할 수 있도록 관련 설정을 제공 - 특정 컴포넌트만 Bean으로 ..
Query did not return a unique result: 2 results were returned 에러 해결하기
·
Backend/Spring Boot
테스트 코드를 작성하다가 문뜩 이런 에러를 마주하였다. Query did not return a unique result: 2 results were returned 엥?.. 왜 2개의 결과값이 들어오지 ? 살펴보니 Repository에서 값을 받아오면서 생긴 문제였다. Optional findByIdentifer (string identifier); 해결 방법은 Optional이 아닌 List로 데이터를 받자! 쉽죠잉? Optional findByIdentifer (string identifier); // 변경 전 List findByIdentifer (string identifier); // 변경 후
[Spring Security] OAuth 2.0 개념과 이해
·
Backend/Spring Security
OAuth제3의 서비스에 계정 관리를 맡기는 방식용어 정리리소스 오너(resource owner) : 자신의 정보를 사용하도록 인증 서버에 허가하는 주체. 서비스를 이용하는 사용자가 리소스 오너에 해당된다.리소스 서버(resource server) : 리소스 오너의 정보를 가지며, 리소스 오너의 정보를 보호하는 주체를 의미. 네이버, 구글, 페이스북이 리소스 서버에 해당한다.인증 서버(authorization server) : 클라이언트에게 리소스 오너의 정보에 접근할 수 있는 토큰을 발급하는 역할을 하는 애플리케이션.클라이언트 애플리케이션(client application) : 인증 서버에게 인증을 받고 리소스 오너의 리소스를 사용하는 주체를 의미. 지금 만들고 있는 서비스가 이해 해당한다.client..
Comparable과 CompareTo
·
Backend/Java
CompareTo() compareTo() 함수는 두개의 값을 비교하여 int 값으로 반환해주는 함수이다. compareTo() 함수에는 “문자열의 비교”와 “숫자의 비교” 두 방식이 존재한다. 숫자의 비교 : 크다(1), 같다(0), 작다(-1)의 결과값을 리턴 문자열 비교 : 같다(0), 그 외 양수/음수값 같이 참 재미난 결과 리턴 비교대상에 문자열이 포함되어 있을 경우 1. 기준값에 비교대상이 포함되어 있을 경우 서로의 문자열 길이의 차이값을 리턴해준다. 예를 보면, “ab”(2) - “a”(1) = 1 “ab”(2) - “ab”(2) = 0 “”(0) - “ab”(2) = -2 “ab”(2) - “”(0) = 2 public class Test { public static void main(St..
[Spring Security] 내부 흐름 - 2
·
Backend/Spring Security
2024.02.17 - [Backend/Spring Security] - Spring Security 내부 흐름(1)에서 Spring Security 내부 흐름에 대해 간략하게 살펴봤다. 이번에는 디버깅을 통해 내부 코드를 파헤쳐보자.  Spring Security 내부 흐름 - 1이 글은 아래 링크의 강의를 바탕으로 정리된 글입니다. https://www.udemy.com/course/spring-security-6-jwt-oauth2-korean/ spring security 내부 흐름 과정 1단계 유저가 로그인 페이지에 본인의 자격증명을 입력 (브kimdozzi.tistory.com   Spring Security를 다루는 과정에서 핵심적인 부분만 확인하고 넘어가는 점을 유의해주세요 !   Spri..
[Spring Security] 내부 흐름 - 1
·
Backend/Spring Security
spring security 내부 흐름 과정1단계유저가 로그인 페이지에 본인의 자격증명을 입력 (브라우저 또는 모바일 애플리케이션의 도움을 받음)유저는 본인의 자격 증명과 함께 요청을 백엔드 웹 애플리케이션에 전달. 이 과정에서 spring security의 도움을 받아 데이터를 보호받는다.spring security filter전달된 정보는 spring security filters에서 받게 된다. security filter는 백엔드 서버에 들어오는 모든 요청을 감시하는 역할을 한다. 동작 과정은 다음과 같다.엔드유저가 접근하고자하는 경로 확인애플리케이션에 구성해둔 경로와 설정에 따라 이 필터들은 보호된 자원인지, 공개적으로 접근가능한지 판별하게 된다.결과에 따라 로그인 페이지를 표시하게 되고, 유저..
[querydsl] 수정, 삭제 배치 쿼리 사용 시 주의할 점
·
Backend/JPA
주의해야할 점 bulk연산을 수행하면, db와 영속성 컨텍스트의 값이 서로 다르다. 쿼리 수행 전 member1 = 10 → DB member1 member2 = 20 → DB member2 member3 = 30 → DB member3 member4 = 40 → DB member4 long execute = queryFactory .update(member) .set(member.username, "비회원") .where(member.age.lt(28)) .execute(); 쿼리 수행 후 member1 = 10 → DB 비회원 member2 = 20 → DB 비회원 member3 = 30 → DB member3 member4 = 40 → DB member4 queryFactory .selectFrom..
[querydsl] @queryProjection vs Projections.constructor
·
Backend/JPA
@QueryProjection vs Projections.constructor constructor : 실제 유저가 코드를 실행하는 순간이 되어서야 문제를 찾을 수 있음, 어떤 파라미터가 필요한지 찾기 어려움 @QueryProjection : 컴파일 단계에 에러를 해결할 수 있다. → querydsl의 의존적으로 설계하게 됨 둘 다 장단점이 있으므로, 본인 프로젝트의 아키텍처에 맞는 선택을 하면 됨
Content type 'application/octet-stream' not supported 에러
·
Backend/Spring Boot
controller에서 multipartFile 타입의 이미지와 json 타입의 dto를 같이 받기 위해 requestpart를 사용하면서 만난 오류이다. dto는 requestbody를 통한 전달이 아닌 form-data로 전달을 해주어야 했고, 그 상황에서 json 타입의 데이터를 보내는 방식에서 문제가 생겼다. form-data 타입의 key-value 값으로 json을 보내줄 때는 content-type을 application/json으로 직접 명시해주자 !! 문제 해결 :)