![[Ubuntu] ssh 원격접속 보안 강화](https://blog.kakaocdn.net/dn/vOZdu/btsLzqF56aG/NTpSpB9fXfkkt4pbYiRsTk/img.jpg)
![[DB 성능 최적화] 인덱스(Index)](https://blog.kakaocdn.net/dn/nA2td/btsI9RE76dJ/L4bSgASjdtfHqK9KGAAC4k/img.png)
![[JPA] 병합(Merge)과 변경 감지(Dirty Checking)](https://blog.kakaocdn.net/dn/bFZDNu/btsIWaxR2k8/cSvhbm9EekSz6ubAKDeTkK/img.png)
![[Linux] 프로세스와 시그널](https://blog.kakaocdn.net/dn/bkg05L/btsKDFCOXxP/e8zaWDdfLamdv5yM8KsPZ1/img.jpg)
![[Docker] Docker Compose를 이용한 SpringBoot + MySQL + Redis 컨테이너 동시에 띄우기](https://blog.kakaocdn.net/dn/bQ4rTl/btsJfoCTWhU/Cfi1RaJSboO8ccgtmJepX1/img.webp)
![[Github Actions] 기본 문법 + 스프링부트 프로젝트 배포 자동화](https://blog.kakaocdn.net/dn/PPr6T/btsJtKAsSo9/rdlgK2vLTiqH2KUkdRBqkK/img.png)
![[Database] 트랜잭션 ACID, DB 연결구조와 세션](https://blog.kakaocdn.net/dn/c7kA33/btsFcQKD9PM/TAAAfUh62KENKRsO32rye0/img.png)
![[JAVA] 상속 - 타입 변환과 다형성(매우 중요)](https://blog.kakaocdn.net/dn/viEHP/btrVjnz9GER/zaV6B2QF28VWdHsPVapgZ1/img.jpg)
![[Linux / Ubuntu] VMware Tools 수동 설치](https://blog.kakaocdn.net/dn/cNmx0k/btsGbDbW1yY/767altqOB2ZCrUZi5Z3tC1/img.png)
![[JSP] IntelliJ 에서 JSP 개발환경 만들기](https://blog.kakaocdn.net/dn/cNQOvx/btsC7qtoxqm/UuNX5TxNKYHXQ3Wk18KFyk/img.png)
![[Git] 소스트리(Sourcetree)로 브랜치(Branch) 다루기](https://blog.kakaocdn.net/dn/1Ulru/btsCy6Do1i6/E5Ooi4C792QgEUJrdGQKAk/img.png)
![[컴퓨터 구조] 명령어의 구조와 주소 지정 방식](https://blog.kakaocdn.net/dn/wjHiK/btr2vnkUSMK/rbuw2sVIIN2RkhYhKkVdGK/img.jpg)

![[JPA] @Builder.Default](https://blog.kakaocdn.net/dn/Cobk0/btsM6iG3kXO/SxKFjCenvMLgkUsT81OXq0/img.png)
@Builder.Default는 Lombok의 @Builder와 함께 사용할 때, 기본값이 무시되지 않도록 유지시켜주는 어노테이션이다.일반적으로 @Builder를 사용하면, 필드에 직접 초기화한 값이 무시된다.@Builderpublic class Product { private String name; private int price = 1000;}위와 같이 price = 1000을 설정했더라도, Product.builder().build()를 실행하면 price는 0이 된다.즉, 기본값 1000이 무시되는 것. 해결 방법@Builderpublic class Product { private String name; @Builder.Default private int price = ..
![[JPA] 엔티티 클래스에서 @Builder 위치](https://blog.kakaocdn.net/dn/DW2Rs/btsM7gHZ67o/DIfjTjnmMtzbGUJL7rUeK0/img.png)
@Builder를 생성자 위에 두는 방식@Getter@NoArgsConstructor(access = AccessLevel.PROTECTED)@Entitypublic class Product extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String productNumber; private String name; private int price; @Builder // 생성자 위에 빌더 public Product(String productNumber, String name, int price) { this.produc..
![[JPA] 엔티티 공통 필드 상속(@MappedSuperclass)](https://blog.kakaocdn.net/dn/7aUcA/btsM6Zmep1n/9U0FJGLbH4OAjVISMFOlp0/img.png)
@MappedSuperclass엔티티마다 생성 날짜와 수정 날짜가 존재한다고 가정하면, 모든 엔티티에 해당 코드를 넣는 것은 비효율적이다.따라서 아래의 코드를 통해서 공통 필드를 상속받게 할 수 있다.@Getter@MappedSuperclass@EntityListeners(AuditingEntityListener.class)public abstract class BaseEntity { @CreatedDate private LocalDateTime createdDateTime; @LastModifiedDate private LocalDateTime modifiedDateTime;}공통 필드(생성일시, 수정일시)를 모든 엔티티에서 자동으로 사용하고 싶을 때이 BaseEntity를 상속받..
![[java] 백준 1300번 문제(K번째 수)](https://blog.kakaocdn.net/dn/xn3v8/btsM4ZU5oSE/Ln4H8w6XAtzgbMxGmcRkRK/img.png)
원본 링크 : https://www.acmicpc.net/problem/1300문제설명 소스코드import java.io.*;public class Boj_1300{ public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); int N = Integer.parseInt(br.readLine()); int K = Integer.par..
![[Spring] 스프링 컨테이너(IoC, DI 컨테이너)](https://blog.kakaocdn.net/dn/bKs3H1/btsM46zw4cc/q2SAe2XuKijZ8Ou4nTOlik/img.png)
이 글은 인프런 김영한님의 Spring 강의를 바탕으로 개인적인 정리를 위해 작성한 글입니다.SRP (Single Responsibility Principle) :하나의 클래스는 오직 하나의 책임만 가져야 한다.OCP (Open/Closed Principle) :소프트웨어 요소는 확장에는 열려 있고, 변경에는 닫혀 있어야 한다.LSP (Liskov Substitution Principle) :자식 클래스는 부모 클래스의 기능을 대체할 수 있어야 한다.ISP (Interface Segregation Principle) :특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.DIP (Dependency Inversion Principle) :구체화가 아닌 추상화에 의존해야 한다. OCP..
![[java] 백준 2343번 문제(기타 레슨)](https://blog.kakaocdn.net/dn/cK9d6F/btsM3TtmLpO/KlLPT8tsKhIiEdRIoJ9PYK/img.png)
원본 링크 : https://www.acmicpc.net/problem/2343문제설명 소스코드import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.StringTokenizer;public class Boj_2343{ static int N, M; static int[] lesson; static int left, right; public static void main(String[] args) throws IOException { BufferedReader br =new BufferedReader(new InputStreamR..
![[Java] @NoArgsConstructor(access = AccessLevel.PROTECTED)](https://blog.kakaocdn.net/dn/EB68d/btsM4eqe1yy/EQNkS2tqllakkI5iCZ3y7k/img.jpg)
@NoArgsConstructor(access = PROTECTED)는 Lombok에서 제공하는 애노테이션으로, 기본 생성자(매개변수가 없는 생성자)를 접근 제어자 protected로 생성해주는 기능을 한다.핵심 의미@NoArgsConstructor(access = AccessLevel.PROTECTED)이 코드는 다음과 같은 생성자를 자동 생성한다. protected 클래스이름() {}즉, 생성자 메서드를 일일이 작성하지 않아도 되고, 접근 제어자까지 명확하게 설정 가능하다. 사용 목적JPA 엔티티용 기본 생성자JPA는 엔티티 객체를 만들 때 기본 생성자가 필요하다.하지만 외부에서 마음대로 new로 객체를 생성하는 건 막고 싶을 때 protected를 쓴다.@Entity@NoArgsConstructor..
주요 메서드 정리JUnit 주요 메서드 (org.junit.jupiter.api.Assertions) 메서드 설명 예시 assertEquals(expected, actual) 값이 같은지 비교 assertEquals(10, sum) assertNotEquals(expected, actual) 값이 다르면 통과 assertNotEquals(0, result) assertTrue(condition) 조건이 true면 통과 assertTrue(value > 0) assertFalse(condition) 조건이 f..
@Test의미: 이 메서드는 테스트 메서드임을 명시한다.위치: 테스트 메서드 위@Testvoid 회원가입_성공() { // given // when // then} @BeforeEach의미: 각 테스트 메서드 실행 직전마다 실행된다.주 용도: 공통 초기화, 테스트 상태 정리@BeforeEachpublic void beforeEach() { memberRepository = new MemoryMemberRepository(); memberService = new MemberService(memberRepository); } @AfterEach의미: 각 테스트 메서드 실행 직후마다 실행된다.주 용도: 리소스 정리, 로그 기록 등@AfterEachpublic void afterEac..
![[java] 백준 1167번 문제(트리의 지름)](https://blog.kakaocdn.net/dn/6bnMq/btsM14nCVE9/ebRQKbjkLpzTVFfGtzpSUk/img.png)
원본 링크 : https://www.acmicpc.net/problem/1167문제설명 소스코드import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.ArrayList;import java.util.StringTokenizer;public class Boj_1167{ static class Node { int number; // 정점 번호 int distance; // 거리 Node(int number, int distance) { this.number = number; ..