전체 글 82

Mybatis 다중 DB 연결 방법 (main, sub)

기존 설정되어있는 SE 데이터베이스 외에 추가로 FC 데이터베이스 연결이 필요한 상황에서 사용한 방법입니다. 각 설정파일 내 어노테이션이나 메소드 등 기능들과 흐름에 대한 설명들은 제외했습니다.일반적이지 않은 상황이라 차후에 저도 참고만 하기위해 단순 사용방법만 작성했습니다. 참고만 해주세요. 나머지는 정보가 많이 있으니 검색해보시기 바랍니다.* 사용 및 구분 명칭기존 사용중인 Database : Se / 신규 추가된 Database : Fc1. properties 또는 yml 설정 * 주의 : 프리픽스(prefix) 설정란에 데이터베이스 주소를 "url" 로 사용중이라면 "jdbc-url"로 변경# SE DBspring.datasource.se.jdbc-url=jdbc:log4jdbc:postgresq..

카테고리 없음 2024.07.04

[JPA] 더티 체킹(Dirty Checking)? + 동시성 이슈/제어

1. 더티 체킹 개념더티 체킹(Dirty Checking): JPA의 기능으로, 영속성 컨텍스트에 담긴 엔티티의 상태 변화를 자동으로 감지하여 트랜잭션 커밋 시점에 변경 사항을 데이터베이스에 반영하는 메커니즘. 2. 영속성 컨텍스트(Persistence Context)정의: 엔티티를 영속성 컨텍스트에 담아 관리하는 일종의 캐시.역할: 엔티티의 상태를 추적하고, 변경된 엔티티를 데이터베이스에 자동으로 반영. 3. 엔티티의 생명주기비영속 상태(New/Transient): 엔티티가 영속성 컨텍스트에 담기지 않은 상태.영속 상태(Managed): 엔티티가 영속성 컨텍스트에 담긴 상태. 더티 체킹의 대상.준영속 상태(Detached): 영속성 컨텍스트에서 분리된 상태.삭제 상태(Removed): 엔티티가 삭제된 ..

JPA 2024.06.13

git clone - intellij 세팅

프로젝트 권한 받기 File -> new -> Get from Version Control (레포지토리 url 또는 깃허브 계정 연결 시 레포지토리 선택) * 레포지토리 구조 그대로 따올경우 gradle 인식 못하는 경우 발생-> build.gradle 우클릭 gradle link? 머머~ 클릭 Project Structure -java version 설정 Setting - Enable annotation processing 체크Build Tools -> gradle -> intelliJ IDEA로 설정(Build and run using, Run tests using) --------------------------- main 레포지토리 fork 후 내 계정에서 관리브런치 하나 만들어서 개발 후  Pu..

Git 2022.05.30

[Security] Success/Failure Handler Custom (인증성공, 인증실패 핸들러 커스텀)

: Security에서 지원하는 인증성공, 인증실패 핸들러를 상속한 클래스를 직접 커스텀하여 사용해보자. 1. 인증성공 핸들러 커스텀 2. 인증실패 핸들러 커스텀 3. config 설정 4. 익명클래스로 처리하는 방법 1. 인증성공 핸들러 커스텀 1. SimpleUrlAuthenticationSuccessHandler를 상속한 커스텀 클래스 CustomAuthenticationSuccessHandler를 만듭니다. 2. requestCache와 RedirectStragey를 사용하여 사용자가 인증 요청 성공시 이전에 접근하려 했던 자원(리소스)의 경로로 바로 보내기 위해서 설정해줍니다. 이전의 접근하려 했던 자원(리소스)가 없는 경우 null을 반환하도록 하여 setDefaultTargetUrl에 설정해..

Spring Security 2021.12.28

[Security] 세션 제어 필터 : SessionManagementFilter, ConcurrentSessionFilter

세션 제어 필터 : SessionManagementFilter, ConcurrentSessionFilter 1. SessionManagementFilter의 핵심적인 4가지 기능 1-1. 세션 관리 : 인증 시 사용자의 세션정보를 등록, 조회, 삭제 등의 세션 이력을 관리 1-2. 동시적 세션 제어 : 동일 계정으로 접속이 허용되는 최대 세션수를 제한 1-3. 세션 고정 보호 : 인증할 때 마다 세션쿠키를 새로 발급하여 공격자의 쿠키 조작을 방지 1-4. 세션 생성 정책 : Always, If_Required, Never, Stateless 2. ConcurrentSessionFilter의 기능 매 요청 마다 현재 사용자의 세션 만료 여부 체크 세션이 만료되었을 경우 즉시 만료 처리 session.isE..

Spring Security 2021.12.09

[Security] 동시세션제어, 세션고정보호, 세션정책

1. 동시 세션 제어 : 동일한 계정으로 인증을 받을 떄 생성되는 세션의 개수가 허용 개수를 초과할 경우 어떻게 세션 유지할지 제어하는 것 최대 세션 허용 개수 초과 시 -> 시큐리티에서 2가지 전략을 제공합니다. 1. 이전 사용자 세션 만료 : 새로운 사용자에게 세션 생성, 이전(기존) 사용자의 세션을 만료시킵니다. 2. 현재 사용자 인증 실패 : 이전(기존) 사용자의 세션을 유지시키고, 새로운 사용자의 인증예외를 발생시킵니다. 사용 방법) http.sessionManagement() : 세션 관리 기능이 작동 protected void configure(HttpSecurity http) throws Exception { http.sessionManagement() .maximumSessions(1) ..

Spring Security 2021.12.08

[HTTP] 캐시(cache)와 조건부 요청

학습내용 캐시 기본 동작 검증 헤더와 조건부 요청 프록시 캐시 캐시 무효화 1. 캐시가 없을 경우 데이터가 변경되지 않아도 계속 네트워크를 통해서 데이터를 다운로드 받아야 한다. 인터넷 네트워크는 매우 느리고 비싸다. 브라우저 로딩 속도가 느리다. 느린 사용자 경험 2. 캐시를 적용할 경우 캐시 가능 시간(유효 시간)동안 네트워크를 사용하지 않아도 된다. -> 유효시간이 남아있는 경우에도 매번 검증이 필요한 경우 네트워크 통신이 이루어지지만 Header의 메타 데이터만 주고 받아 데이터 원문이 담긴 Body는 생략되기 때문에 가볍다, 물론 데이터의 수정이 이루어진 경우를 대비해 검증 Header를 가지고 조건부 요청을 해야한다. 검증 헤더 : Last-Modifed ,ETag 조건부 요청 헤더 : If-..

HTTP 2021.12.06

[Spring] 웹 스코프(request scope) 와 Provider / 프록시

웹 스코프의 특징 웹 스코프는 웹 환경에서만 동작합니다 웹 스코프는 프로토타입과 다르게 스프링이 해당 스코프의 종료 시점까지 관리하기에 종료 메서드가 호출됩니다 웹 스코프의 종류 request : HTTP 요청 하나가 들어오고 나갈 떄 까지 유지되는 스코프, 각각의 HTTP 요청마다 별도의 빈 인스턴스가 생성되고, 관리됩니다 session : HTTP Session과 동일한 생명주기를 가지는 스코프 application : 서블릿 컨텍스트(ServletContext)와 동일한 생명주기를 가지는 스코프 websocket : 웹 소켓과 동일한 생명주기를 가지는 스코프 학습 내용에 따라 requset 스코프를 기준으로 다루어 보겠습니다. 나머지는 범위만 다르고 동작 방식은 비슷합니다 그림과 같이 클라이언트 A..

Spring 2021.11.30

[Spring] 빈 스코프(프로토타입 스코프 / prototype scope)

프로토타입(prototype) 스코프 빈 스코프란? 스프링은 빈을 기본적으로 싱글톤으로 생성하기 때문에 스프링 컨테이너의 시작과 함께 생성되어 스프링 컨테이너가 종료될 때 까지 유지됩니다. 스코프는 말 그대로 빈이 유지할 수 있는 범위를 말합니다. 스프링은 다음과 같은 다양한 스코프를 지원합니다. 싱글톤 : 기본 스코프, 스프링 컨테이너의 시작부터 종료까지 유지되는 가장 넓은 범위의 스코프 프로토타입 : 스프링 컨테이너가 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고 더 이상 관리하지 않는 매우 짧은 범위의 스코프 웹 관련 스코프 request : 웹 요청이 들어오고 나갈때 까지 유지되는 스코프 session : 웹 세션이 생성되고 종료될 때 까지 유지되는 스코프 application : 웹의 서블..

Spring 2021.11.29

[JPA] 엔티티 설계시 주의점

엔티티 설계시 주의점 1. 엔티티에는 가급적 Setter를 사용하지 말자 Setter가 모두 열려있다 -> 변경 포인트가 너무 많아서 유지보수가 어렵다 2. 모든 연관관계는 지연로딩(fetch = FetchType.LAZY)으로 설정하자 즉시로딩은 특정 엔티티를 조회할 때(로딩될 떄) 연관된 모든 엔티티를 조회한다. 기본적으로 전부 지연로딩(LAZY)로 셋팅을 하고 필요에 따라 연관된 원하는 엔티티를 같이 조회할 경우 fetch join 또는 엔티티티 그래프로 최적화를 하는 것이 좋다 즉시로딩(EAGER)은 예측이 어렵고, 어떤 SQL이 실행될지 추적하기 어렵다 특히 JPQL을 실행할 떄 N+1 문제가 자주 발생한다 실무에서는 모든 연관관계는 지연로딩(LAZY)로 설정해야 한다 연관된 엔티티를 함께 DB..

JPA 2021.11.26

[HTTP] HTTP 상태코드

HTTP 상태코드 - 클라이언트가 보낸 요청의 처리 상태를 응답에서 알려주는 기능 1xx (Informational) : 요청이 수신되어 처리중 2xx (Successful) : 요청을 정상적으로 처리함 3xx (Redirection) : 요청을 완료하려면 추가 행동이 필요함 4xx (Client Error) : 클라이언트 오류, 잘못된 문법등으로 서버가 요청을 수행할 수 없음 5xx (Server Error) : 서버 오류, 서버가 정상적으로 요청을 처리하지 못함 - 만약 모르는 상태 코드가 나타나면? - 클라이언트가 인식할 수 없는 상태코드를 서버가 반환하면? 해결방법 : 클라이언트는 상위 상태코드로 해석해서 해결하면 된다 예) 299 ??? -> 2xx (Successful) 451 ??? -> 4..

HTTP 2021.11.22

[MySQL] SQL Error (1038): Out of sort memory, consider increasing server sort buffer

웹상에서 크롤링한 데이터를 DB에 넣어주고 저장된 결과를 조회하기 위해 쿼리를 실행 하였더니 발생하였다. MySQL/MariaDB에서는 데이터를 정렬하기 위해 별도의 메모리 공간을 할당하는데 이때 사용되는 메모리가 "Sort buffer"이라 하는데 쿼리 실행 후 반납된다고 합니다. mysql 설정파일에서 sort_buffer_size 크기를 증가시켜주면 된다고합니다. sort_buffer_size가 선언되어 있지 않다면 새로 추가해 주시고 존재할 경우 크기만 수정합니다. 그리고 나서 저장한 후 서비스를 재기동 해주시면 됩니다. * MySQL의 설정파일의 경로는 서버마다 다르니 직접 찾아보시기 바랍니다. * 윈도우 파일 경로 : C:\ProgramData\MySQL\MySQL Server 8.0\my.i..

카테고리 없음 2021.11.16

[Git] git pull 에러 "your local changes to the following files would be overwritten by merge"

얼마 전 서버 내에서 java application.properties에 직접 접근하여 IP를 잠시 수정했다가 돌려놓았던 일이 있었는데 그로인해 수정사항이 생기는 바람에 .add 하지 않을 경우 실패되는 상황이 발생했다. 에러내용) error: Your local changes to the following files would be overwritten by merge: src/main/resources/application.properties Please commit your changes or stash them before you merge. 번역내용은 아래와 같습니다. 오류: 다음 파일에 대한 로컬 변경 사항은 병합에 의해 덮어쓰여집니다. src/main/resources/application...

Git 2021.11.16

[Thymeleaf] 타임리프로 화면단에서 사용자 시큐리티 정보 가져오기

스프링 시큐리티 인증을 받은 로그인 한 사용자의 정보를 타임리프에서 사용하고 싶을 때 사용합니다. .gradle 설정 implementation 'org.springframework.boot:spring-boot-starter-security' // 타임리프에서 스프링시큐리티의 문법이나 형식을 지원하는 확장팩 라이브러리 implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5' 우선 네임스페이스를 등록합니다. 사용 예시 출력 결과 1. 사용자 이름 2. 사용자 권한 3. 사용자 인증여부 추가로 아래는 조건의 결과를 true, false로 if와 같은 기능으로 사용 가능합니다. 참조. Thymeleaf + Spring Security in..

Thymeleaf 2021.11.10

[JPA] Pageable 사용 시 Page<Entity>를 Page<DTO>로 변환하기(Builder, 람다식 사용)

각 레이어간의 역할을 확실히 분리하기 위해서 클라이언트에 전달 할 객체는 항시 DTO로 변환해서 전달 합니다. 이떄 Spring Data Jpa 에서 제공하는 Pageable을 사용할 경우 반환받은 Page를 Page로 변환하는 상황이 생겨서 기록하였습니다. 1. Repository public interface BoardRepository extends JpaRepository { // Containing : like와 비슷한 문법 Page findByTitleContainingOrContentContaining(String title, String content, Pageable pageable); } 'title'과 'content'를 인자값으로 전달받아 where 검색결과를 return하도록 설정..

JPA 2021.10.26

[Spring] ModelMapper 대신 Mapstruct 사용하기

Entity와 DTO간의 객체 매핑시 사용하는 라이브러리로 ModelMapper와 Mapstruct가 있습니다. 기존에는 ModelMapper를 사용하고 있었지만 Mapstruct가 속도와 성능, 기능면에서 더 우수하다는 글을 보고 구글링하면서 리팩토링을 진행하게 되었습니다. 직접 사용한 부분만 정리하여서 부족한 내용이 많이 있습니다. Mapstuct의 특징 컴파일 시 오류를 확인할 수 있다. 리플렉션(Reflction)을 사용하지 않기 때문에 매핑 속도가 빠르다. (ModelMapper는 런타임 시점에 매핑을 시도합니다.) 디버깅이 쉽다. 생성된 매핑 코드를 눈으로 직접 확인할 수 있다. (생성된 구현체로 직접 접근하여 확인할 수 잇습니다.) 참조) Java - Model(Object) mapping을..

Spring 2021.10.17