본문 바로가기

JAVA36

[JPA] Soft Delete 적용과 @Where, @SQLDelete 프로젝트 중 hard delete 에서 soft delete 로 리팩토링한 과정과 @Where, @SQLDelete 에 관한 생각이다. Spring boot + JPA 로 프로젝트 진행 중, delete 관련 에러가 생겼고 관련 코드를 보며 앞으로의 delete 에러를 줄이기 위해서는 hard delete 가 아닌 soft delete 로 리팩토링 해야겠다는 생각을 했다. Soft Delete vs Hard Delete soft delete (물리 삭제) 는 SQL 의 delete 를 사용해 실제로 데이터를 삭제하는 방법이다. hard delete (논리 삭제) 는 삭제 여부를 판단하는 필드를 만든 후, 해당 필드를 SQL 의 update 를 통해 변경하여 삭제가 되었다고 표기하는 방법이다. 이때, 다른.. 2023. 9. 6.
Instanceof 를 사용하지 않고 자식 클래스 타입 확인하기 프로젝트 중 클래스 상속 설계를 하며 자식 클래스 타입 확인 시 생길 수 있는 상황에 대해 고민하고 정리해 보았다. @Inheritance(strategy=InheritanceType.JOINED) @DiscriminatorColumn public abstract class Shelter { ... } @DiscriminatorValue("a") public class AShelter extends Shelter { ... } @DiscriminatorValue("b") public class BShelter extends Shelter { ... } 추상클래스 Shelter 와 클래스 AShelter, BShelter 가 있다고 하자. JPA 를 사용하고 AShelter, BShelter 는 Shelt.. 2023. 7. 16.
[Spring Security] JWT + OAuth2.0 적용해보기 - (2) https://mintgreentea.tistory.com/49 [Spring Security] JWT + OAuth2.0 적용해보기 - (1) spring security 학습과 Spring boot 에 JWT, OAuth2.0 적용을 위해 간단한 프로젝트를 진행해 보았습니다. 이번 프로젝트로 filter 기반의 Spring Security 아키텍처를 이해하고, JWT 와 OAuth2.0 의 이해 및 적용을 mintgreentea.tistory.com 위에서 진행한 프로젝트를 기반으로 OAtuh2.0 로그인을 추가해보았다. OAuth2.0 를 통해 access token 과 refresh token 을 받으면, 인증이 필요한 request 나 access token 재발급 등은 이전에 구현된 코드들로 .. 2023. 2. 2.
[Spring Security] JWT + OAuth2.0 적용해보기 - (1) spring security 학습과 Spring boot 에 JWT, OAuth2.0 적용을 위해 간단한 프로젝트를 진행해 보았습니다. 이번 프로젝트로 filter 기반의 Spring Security 아키텍처를 이해하고, JWT 와 OAuth2.0 의 이해 및 적용을 목표로 하였습니다. JWT 기반 인증 이번 프로젝트는 access token 과 refresh token 을 모두 사용하는 방법을 채택했습니다. access token 과 refresh token 을 사용한 flow 는 다음과 같습니다. AT : Access Token. 만료기간 짧음, RT : Refresh Token. 만료기간 김 case 0 ) login /login 로그인 성공 시, 200 - memberId, AT1, RT1 res.. 2022. 12. 1.
[Java] 스레드(Thread)와 동기화(Synchronization) 스레드(Thread) 스레드는 실행 중인 프로그램/프로세스 내에서 실행되는 흐름의 단위를 말한다. 일반적으로 한 프로그램은 하나의 스레드를 가지고 있지만, 프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있다. 이러한 실행 방식을 멀티스레드(multithread)라고 한다. 보통 스레드 하나에 CPU의 코어 하나가 할당되어 동시에 실행이된다. 스레드는 동시에 독립적으로 실행이 되므로 동일한 실행결과를 보장할 수 없다. public Thread(Runnable target) { ... } Thread의 생성자는 매개변수 타입으로 java.lang.Runnable 인터페이스를 가진다. Runnable 인터페이스는 하나의 추상메서드인 void run() 을 가지는 함수형 인터페이스이다. Runnab.. 2022. 10. 11.
[Java] NIO 와 NIO.2 Path 클래스 Path pt1 = Paths.get("C:\\JavaStudy\\PathDemo.java"); Path pt2 = pt1.getRoot(); Path pt3 = pt1.getParent(); Path pt4 = pt1.getFileName(); Path 인터페이스는 경로를 표현하기 위한 인터페이스다. java.io.File 클래스를 대체하기 위해 정의된 인터페이스로 java.nio.file 패키지에 정의되어 있다. 인스턴스의 생성은 해당 파일/디렉토리의 존재 유무와 상관이 없고 실행한다고 하여 파일/디렉토리가 생성되는 것도 아니다. Path 인스턴스를 사용하여 파일이나 디렉토리의 정보를 담은 인스턴스를 생성할 수 있다. 파일 및 디렉토리 생성 public static Path creat.. 2022. 10. 2.
[Java] I/O 스트림 I/O 스트림 데이터의 흐름을 스트림(Stream)이라고 한다. 자바에서 입출력 대상에 상관없이 동일한 방법으로 입출력을 할 수 있도록 I/O 스트림 모델이라는 것을 정의했다. 자바 I/O 모델의 스트림을 I/O 스트림이라고 한다. 스트림 관련 클래스들은 java.io 패키지에 정의되어 있다. I/O 스트림은 크게 입력 스트림(Input Stream)과 출력 스트림(Output Stream)으로 나뉜다. 입력 스트림은 실행 중인 자바 프로그램으로 데이터를 읽어 들이는 스트림이고, 출력 스트림은 실행 중인 자바 프로그램으로부터 데이터를 내보내는 스트림이다. /** try-catch-finally **/ OutputStream out = null; try { out = new FileOutputStream(.. 2022. 9. 29.
[Java] 시각과 날짜의 처리 Instant 클래스 Instant now = Instant.now(); now.getEpochSecond(); Instant 클래스는 타임 라인의 특정 시점을 표현하는 클래스이다. 위의 코드 처럼 now 메서드를 사용하면 현재 시각 정보를 담은 인스턴스를 생성할 수 있다. '1970-01-01 00:00:00' 을 표준 자바 epcoh 이라고 한다. getEpcohSecond 메서드를 사용하면 표준 자바 epoch 을 기준으로 지나온 시간을 초 단위로 계산한 결과를 반환한다. Duration 클래스 Instant start = Instant.now(); ... Instant end = Instant.now(); Duration between = Duration.between(start, end); Sy.. 2022. 9. 24.
[Java] Stream 스트림(Stream) int[] arr = {1, 2, 3, 4, 5} /* example1 */ IntStream stm1 = Arrays.stream(arr); // 스트림 생성 IntStream stm2 = stm1.filter(n -> n%2 == 1);// 중간 연산 int sum = stm2.sum(); // 최종 연산 /* example2 */ int sum = Arrays.stream(arr) // 스트림 생성 .filter(n -> n%2 == 1) // 중간 연산 .sum(); // 최종 연산 Java 에서 데이터의 흐름을 생성할 수 있는데, 이러한 흐름을 스트림(Stream)이라고 한다. 배열이나 컬렉션 인스턴스를 다룰 때 for문이나 iterator를 사용하여 접근하였다. Java .. 2022. 9. 23.