싱글톤 패턴이란? 하나의 인스턴스만 생성하여 사용하는 디자인 패턴 (클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴) 사용법 static 영역에 객체 instance를 하나 미리 생성한다 이 객체 인스턴스가 필요하면 오직 getInstance() 메서드를 통해서만 조회할 수 있도록 한다 (이 메서드는 항상 같은 인스턴스를 반환함) 오직 하나의 객체 인스턴스만 존재해야 하므로, 생성자를 private으로 막아서 혹시라도 외부에서 new 키워드로 객체 인스턴스가 생성되는 것을 막아준다 public class SingletonService { // static 영역에 객체를 "1개"만 생성해둔다 private static final SingletonService instance = new S..
JPA를 이용해 간편하게 메서드 네이밍을 사용하던 중 문제가 발생했다 A and (B or C)를 찾는 메서드를 만들어야 하는데 어렵다... 사실 그냥 쿼리를 만들면 쉽긴 하다만JPA메서드네이밍만으로 할 수 있을 것 같아서 도전해 봤다 Page findAllByProductCategories_Category_CategoryIdAndNameContainsOrProductCategories_Category_CategoryIdAndBrandContains(long categoryId1, String name, long categoryId2, String brand, Pageable pageable); ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 만들고 보니 어이가 없다 ㅋㅋㅋ 그래도 약간의 ..
Github Actions를 이용하여 EC2, Linode 등 ubuntu 서버에 자동배포를 알아보겠습니다. 우선 본인의 서버 pc에 접속하여 기본적인 세팅을 해줍시다. sudo apt update # 각자 원하는 버전을 설치하시면 됩니다 sudo apt install openjdk-11-jre-headless 서버에서 사용할 포트도 열어줍니다 EC2 -> 보안탭의 인바운드 규칙 수정 Linode -> firewalld 를 사용하여 포트 개방 (기본적으로 열려있음) 자동배포할 프로젝트 레포지토리로 이동하여 Settings - Actions - Runners - New self-hosted runner로 이동합니다 운영 체제에 맞게 선택해주시고 표시한곳까지 서버 터미널에 명령어들을 차례로 입력해 줍니다. ..
클라이언트 측에서 Header에 Jwt 토큰을 실어 보내면 해당 정보를 볼 수 있는 방법을 간단하게 알아보겠습니다. 커스텀 애너테이션 @Login이라는 커스텀 애너테이션을 만들어서 UserDetails 객체에 받아온다 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.PARAMETER) @AuthenticationPrincipal public @interface Login { } @GetMapping public void getJwtEmailTest(@Login UserDetails userDetails) { System.out.println("@Login : " + userDetails.getUsername()); } @AuthenticationPrin..
JPA란 ? Java 진영에서 사용하는 ORM 기술의 표준 사양 - Java의 인터페이스로 사양이 정의되어 있음 Java Persistence API의 약자이지만 현재는 Jakarta Persistence라고도 불림 Hibernate ORM JPA 표준 사양을 구현한 구현체 (이 외에도 EclipseLink, DataNucleus 등이 있음) 데이터 액세스 계층에서의 JPA 위치 데이터 액세스 계층의 상단에 위치함 데이터 저장, 조회 등의 작업은 JPA를 거쳐 JPA의 구현체인 Hibernate ORM을 통해서 이루어지며 Hibernate ORM은 내부적으로 JDBC API를 이용해서 데이터베이스에 접근한다 영속성 컨텍스트 (Persistence Context) JPA의 P에해당하는 Persistence..
Write Once, Run Anywhere JVM (Java Virtual Machine) 운영체제로부터 독립적으로 동작할 수 있게 해주는 이유 자바로 작성한 소스 코드를 각 운영체제에 맞게 해석해서 실행하는 별도의 프로그램 (일종의 통역가 역할) 각 운영체제에 적합한 버전이 존재함 JVM 메모리 구조 JVM에 Java 프로그램이 로드되어 실행될 때 특정 값 및 바이트코드, 객체, 변수 등과 같은 데이터들이 런타임 데이터 영역에 저장된다 런타임 데이터 영역은 크게 5가지로 구분되어 있다 Runtime Data Area Stack Area Heap Area Method Area PC Register Native Method Stack Garbage Collection 메모리를 자동으로 관리하는 프로세스 ..
start() : 스래드를 실행 대기 상태로 만든다 sleep(long milliSecond) : milliSecond 동안 스레드를 잠시 멈춘다 interrupt() : 일시 중지 상태인 스레드를 실행 대기 상태로 복귀시킨다 yield() : 다른 스레드에게 실행을 양보한다 join() : 특정 스레드가 작업하는 동안에 자신을 일시 중지 상태로 만든다 notify(), wait() : 스레드 간 협업에 사용
싱글 스레드 프로세스 : 데이터에 단 하나의 스레드만 접근하기 때문에 상관없음 멀티 스레드 프로세스 : 두 스레드가 동일한 데이터를 공유하게 되어 문제 발생 가능성 존재함 하나의 계좌에서 현금을 출금한다고 가정한다 더보기 package 스레드; public class Main { public static void main(String[] args) { Runnable threadTask = new ThreadTask(); Thread thread1 = new Thread(threadTask); Thread thread2 = new Thread(threadTask); thread1.setName("김이룸"); thread2.setName("이자바"); thread1.start(); thread2.start..
메인 스레드는 main이라는 이름을 가지며, 그 외에 추가적으로 생성한 스레드는 "Thread-n"이라는 이름을 갖는다 스레드 이름 조회하기 .getName() public class Main { public static void main(String[] args) { Thread thread = new Thread(new Runnable() { public void run() { System.out.println("Get Thread Name"); } }); thread.start(); System.out.println("thread.getName() = " + thread.getName()); } } // 출력 Get Thread Name thread.getName()=Thread-0 스레드 이름 설..