Backend

· Backend/JWT
목표 : JWT 인증/인가 과정을 구현 그 전에 Spring Security를 알아보자 들어가기 전에 Spring Security 스프링 시큐리티는 스프링 기반의 애플리케이션 보안(인증, 인가, 권한)을 담당하는 스프링 하위 프레임워크이다. 스프링 시큐리티는 이러한 필터들을 또 다시 하나로 묶어 하나의 인증 영역을 만들고 이를 SecurityFilterChain 객체로 관리한다. (기존에는 하나의 SecurityFilterChain을 구성하기 위해서 WebSecurityConfigurerAdapter를 상속한 클래스에서 config 메소드를 오버라이딩한다. 하지만 스프링 시큐리티 5.7.0 버전부터 WebSecurityConfigurerAdapter를 사용하지 않는다고 되어있다.) Spring Secur..
· Backend/JWT
들어가기 전에 인증과 인가 인증은 사용자의 신원을 입증하는 과정이다. 예를 들어 회사에 지문이나 신분증으로 회사 사람인 것을 입증하는 것이다. 인가는 사이트의 특정 부분에 접근할 수 있는지 권한을 확인하는 작업이다. 예를 들어 내가 회사원이라고 해도 모든 곳에 접근 가능한 것은 아니다. 보안 담당자만이 접근할 수 있는 사무실은 들어가지 못한다. 일반 사원, 보안 담당자등 권한에 따라 접근할 수 있는지가 다르다. JWT는 왜 필요할까? 인증/인가 방식 중에 하나이다. stateless하므로 서버가 상태를 보관하고 있지 않은 특징이 있다. 서버는 한번 발급한 토큰에 대해서 제어권을 가지고 있지 않다. 그런데 JWT는 외부에 노출되는 경우 치명적인 보안 이슈가 발생할 수 있다. 서버는 탈취한 것을 알지 못한채..
· Backend/Java
들어가기 전에 서버에서 서버로 RestTemplate을 이용하는데 Json에서 Dto로 변환할 때(역직렬화) 이슈가 있었다. 이때 직렬화, 역직렬화에 대한 개념을 정리하고 과정에서 생긴 이슈를 분석하고자 한다. 여기에서 사용된 코드는 실제 회사에서 사용한 코드는 아니며, 포스팅을 위해 최대한 유사하게 만들어진 별도의 샘플 코드이다. 스프링에서의 직렬화와 역직렬화란? 스프링 HTTP 요청 / 응답 과정에서 자바 객체 ↔ JSON 간에 변환을 하는 것이 직렬화와 역직렬화이다. HTTP 응답은 서버 → 클라이언트 흐름이기 때문에 자바 객체 → JSON 변환인 직렬화 과정이고, HTTP 요청은 클라이언트 → 서버 흐름이기 때문에 JSON → 자바 객체 변환인 역직렬화 과정이다. 즉, ResponseDto를 HT..
· Backend/Java
비교 == (동일성 identity 비교) 객체의 주소값 비교로 같은 메모리 공간을 가리키는지 확인 equals (동등성 equivalence 비교 ) 객체의 내부 값이 같은지 비교한다. 객체 지향 프로그래밍(OOP)에서 인스턴스(instance)는 해당 클래스의 구조로 컴퓨터 저장공간에서 할당된 실체를 의미한다. 여기서 클래스는 속성과 행위로 구성된 일종의 설계도이다. OOP에서 객체는 클래스와 인스턴스를 포함한 개념이다.(위키피디아) 그렇기 때문에 정확히 표현하면 인스턴스겠지만 여기서는 객체라고 하겠다. equals() public class Money { int amount; String currencyCode; public Money(int amount,String currencyCode){ th..
· Backend
문제엘라스틱 서치로 API 응답 최대소요시간 그래프를 통해 /api/v1/user-challenges인 URL path에서 높은 duration을 발견했다.원인 파악 과정SQL 쿼리 분석 : N+1 문제 발견연관관계 분석 :       2-1. UserChallenge 와 Challenge 는 N:1 단방향 연관관계       2-2. Challenge와 ChallengeRecord는 1:1 양방향 연관관계    2-3. UserChallenge를 조회하면서 연관관계인 Challenge를 조회한다. 그리고 Challenge와 연관관계인 ChallengeRecord를 조회함 3. 일대일 단방향 관계에서 N+1 문제 원인 분석 (Challenge와 ChallengeRecord)     3-1. Challen..
· Backend
Jmeter란? 아파치에서 제공하는 어플리케이션으로, java로 이루어진 오픈소스의 성능테스트 도구 다른 테스트 도구들 보다 좀 더 웹서버 성능테스트에 특화 되어져 있다. 테스트케이스를 스크립트화하는 기능이 따로 있진 않지만, 레코딩 기능을 지원해주고, ui기능을 통해 다양한 부하테스트를 시도하는 것이 가능 Jmeter의 장점 복잡하고 디테일한 부하테스트가 가능하고, 다양한 프로토콜을 혼용해서 사용이 가능하다 기능적으로 스크립트 레코딩(script recording)이 가능하다 UI를 통한 테스트 프로그램의 작성이 가능하기 때문에, locust보다 언어의 요구사항이 낮다(하지만 사용성은 다양한 기능을 제공해 주는 만큼 더 어렵다) 환경 mac m1 Java 11 설치 1. 자바 설치 후(자바 8 이후여야..
· Backend/Java
String의 null과 빈 값(””)처리 null이나 빈 값이 들어올때 어떻게 처리해야하는지 고민했다. String의 값이 어떤 값이 들어올때 처리를 안해주는지 정의해준다. null 빈 값(””) white space //1. String name=null; //널 System.out.println(name==null); //true //2. String name2=""; //빈 값 String name3=" "; //공백 System.out.println(name2.isEmpty()); //true System.out.println(name2.equals("")); //true System.out.println(name3.isEmpty()); //false System.out.println(name3..
상황 update쿼리를 날리는 함수인 updateState에서 TransactionRequiredException :Executing an update/delete query 에러가 발생 @Override public Long updateState( LocalDate date, UserChallengeStateType beforeState, UserChallengeStateType afterState ) { final Predicate[] predicates = new Predicate[]{ qUserChallenge.state.eq(beforeState), qUserChallenge.startDate.eq(date) }; long resultCount = update(qUserChallenge) .se..
들어가기 전에) Transactional의 @Transactional의 readonly 옵션을 true로 사용하면 성능이 좋다고 한다. 왜일까? “읽기 전용 쿼리의 성능 최적화”로 엔티티가 영속성 컨텍스트에 관리되면 1차 캐시부터 변경 감지까지 얻을 수 있는 혜택이 많다 하지만 영속성 컨텍스트는 변경 감지를 위해서 스냅샷 인스턴스를 보관하므로 더 많은 메모리를 사용하는 단점이 있다. 만약 조회만 하는 경우에는 읽기전용(@Transactional(readonly=true))를 사용하여 엔티티를 조회하면 메모리 사용량을 최적화할 수 있다. 결론: 조회를 하는 경우에는 @Transactional(readonly=true)을 사용하자! 영속성 컨텍스트에서 변경감지와 스냅샷 저장을 하지 않기 때문에 성능을 최적화..
Lombok이란? 프로젝트가 객체 중심으로 개발하던 데이터 중심으로 개발하던 개발자들은 VO/DTO/Domain 객체를 생성해 getter/setter 그리고 toString 메서드를 만듭니다. 처음에 개발 초기에는 깔끔하게 하지만 잦은 수정과 필드명 변경 추가에 따라 관리가 쉽지 않습니다. 그래서 롬복(Lombok)은 자바 클래스를 만들때 자주 사용되는 getter/setter나 toString 등의 코드를 애너테이션으로 대체해서 선언하고 java 코드를 컴파일 할 때 그에 맞는 코드를 생성해주는 것이다. Lombok 의존성 추가 (build.gradle) implementation 'org.projectlombok:lombok' 하지만 의존성을 추가해주고도 에러가 생겼다. 상황 : @Getter을 선..
호_두씨
'Backend' 카테고리의 글 목록 (2 Page)