BE/Java 53

[Java] HttpServletRequest

Servlet API의 일부, 클라이언트에서 서버로 들어오는 HTTP요청 정보를 캡슐화하여 제공하는 인터페이스웹 애플리케이션에서 HTTP 요청을 처리할때 오청의 헤더, 파라미터, 메서드(GET, POST 등), 쿠키, 세션정보를 확인할 수 있도록 다양한 메서드를 제공 HttpServletRequest 주요 메서드와 속성1. 요청 메서드 확인String getMethod()클라이언트가 사용한 HTTP메서드 (GET, POST, PUT 등)를 반환한다2. 요청 URL과 URIString getRequestURI()요청된 리소스의 경로를 반환한다 (예 : /example/path)StringBuffer getRequestURL()요청된 전체 URL을 반환한다 (예 : http://example.com/exam..

BE/Java 2025.01.08

[Java] Jackson 라이브러리

Java객체와 JSON간의 직렬화 및 역직렬화를 간단하고 효율적으로 처리할 수 있는 라이브러리주로 Spring Boot와 같은 프레임워크에서 JSON데이터를 처리하는데 기본적으로 사용된다Jackson 어노테이션과 주요 속성 1. @JsonPropertyJSON 속성과 Java 필드 간의 매핑을 설정.주요 속성:value: JSON 속성 이름을 설정.required: 필드가 JSON 데이터에 필수인지 여부를 설정.access: 직렬화/역직렬화 접근 수준(READ_ONLY, WRITE_ONLY, READ_WRITE). 2. @JsonIgnore특정 필드를 JSON 직렬화 및 역직렬화에서 제외.이 필드는 JSON에 포함되지 않음. 3. @JsonIgnoreProperties여러 필드를 한 번에 무시.주요 속성..

BE/Java 2025.01.07

[JPA] N + 1 문제

데이터베이스와 관련된 성능 이슈로, JPA나 ORM을 사용할때 자주 발생한다한번의 쿼리로 해결할 수 있는 작업이 여러번의 쿼리로 나뉘어 실행되면서 성능 저하를 유발하는 문제 동작 과정1. 1개의 쿼리 실행먼저 1 에 해당하는 쿼리를 실행해 특정 엔티티의 리스트를 가져온다예 : SELECT * FROM orders; (주문 데이터를 조회)2. N개의 추가 쿼리 실행가져온 각 엔티티와 연관된 데이터를 조회하기 위해 N개의 추가 쿼리가 실행된다예 : 각 주문에 연관된 고객 데이터를 가져오는 쿼리예제 및 동작 설명Order 와 Customer 관계 (@ManyToOne) :@Entitypublic class Order { @Id @GeneratedValue private Long id; @..

BE/Java 2025.01.06

[Java] Generic 제너릭

Java의 클래스, 메서드, 인터페이스에서 사용할 데이터 타입을 일반화하여 유연성과 코드 재사용성을 높이기 위한 기능타입을 미리 지정하지 않고 나중에 사용할 때 타입을 명시적으로 정의하는 방법 사용하는 이유1. 타입 안정성 보장잘못된 타입을 사용하는 실수를 컴파일 시점에서 방지예 : String만 들어가야 할 리스트에 Integer가 들어가지 않도록 방지2. 형변환의 간소화제너릭을 사용하면 데이터 타입을 미리 명시하므로 명시적 형변환이 필요없음코드가 간결하고 가독성이 높아짐3. 코드 재사용성다양한 데이터 타입에 대해 동일한 로직을 처리하는 코드를 작성 가능제너릭 기본 문법제너릭 클래스 :// T는 타입 파라미터로, 나중에 실제 데이터 타입으로 대체됨public class Box { private T..

BE/Java 2025.01.04

[Java] enum

열거형, 서로 관련된 상수들의 집합을 정의할 때 사용하는 데이터타입값이 고정된 상수 집합을 다룰 때 가독성을 높이고 오류를 줄이는데 유용1. enum의 기본 구조public enum Day { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY}enum은 클래스처럼 보이지만, 고정된 상수 값을 가지는 특별한 데이터 타입이다각 상수는 대문자로 작성하는것이 관례enum값은 기본적으로 0부터 시작하는 정수 값(ordinal)으로 관리된다2. enum 사용방법1) 기본사용public class Main { public static void main(String[] args) { Day today = Day.MONDAY; ..

BE/Java 2025.01.01

[Java] @IdClass

JPA에서 복합키를 매핑하는 방법중 하나, 복합키를 정의하는 별도의 클래스를 사용복합키를 지정할때 @IdClass 를 사용하여 엔티티와 연결 복합키두개 이상의 컬럼을 조합하여 기본키로 사용하는 것을 의미설정 방식1. 식별자 클래스 정의복합키에 포함될 필드를 정의한 클래스를 작성2. 엔티티 클래스와 연결엔티티에서 어노테이션을 사용하여 식별자 클래스를 지정하고, 각 필드를 @Id로 선언예제테이블 구조 :Order---------------------------------order_id (PK)product_id (PK)quantity 식별자 클래스 정의 :import java.io.Serializable;import java.util.Objects;public class OrderId implements S..

BE/Java 2024.12.31

[Java] @Builder, @ToString, @EqualsAndHashCode, @Singular

롬복에서 제공하는 어노테이션으로, 객체 생성시 복잡한 생성자 호출 대신 가독성 높은 방식으로 객체를 생성할 수 있게 해준다 빌더 패턴의 기본 개념1. 객체 생성의 유연성 제공필수 필드와 선택적 필드를 구분하여 객체 생성 가능2. 가독성 향상매개변수가 많은 생성자보다 각 필드를 명확하게 지정 가능3. 불변 객체 생성객체를 생성한 후 내부 상태를 변경하지 않도록 설계 가능빌더의 사용법기본 사용법import lombok.Builder;import lombok.ToString;@Builder@ToStringpublic class User { private String name; private int age; private String email;}public class Main { publ..

BE/Java 2024.12.23

[Java] 프록시

대리인이나 중개자를 뜻하며, 소프트웨어에서는 다른 객체에 대한 접근을 제어하거나 대체 역할을 하는 객체를 말한다쉽게말해, 원래 객체에 접근하기 전에 중간에 끼어드는 객체프록시의 필요성1. 추가 작업 수행원래 객체를 호출하기 전후에 부가 작업을 수행해야 할때예: 로깅, 인증, 캐싱, 지연 로딩 등2. 원래 객체 보호원래 객체에 대한 접근을 제한하거나 제어예: 보안 관련 작업3. 성능 최적화실제 객체의 생성이나 초기화를 나중으로 미루는 경우 (지연 로딩)4. 구조적 유연성객체 교체나 확장성을 높이기 위해 중간 계층을 추가프록시의 종류1. 정적 프록시 (Static Proxy)컴파일 시점에 프록시 객체를 작성원래 객체와 동일한 인터페이스를 구현코드가 고정적이고, 클래스별로 프록시를 별도로 작성해야함interf..

BE/Java 2024.12.22

[Java] 쓰레드

자바에서 쓰레드 사용하는 법 1. Thread 클래스를 상속받는 방법java.lang.Thread 클래스를 상속받아 생성하고 실행class MyThread extends Thread { @Override public void run() { // 스레드의 작업 내용 System.out.println("Thread is running!"); }}public class Main { public static void main(String[] args) { MyThread thread = new MyThread(); thread.start(); // 스레드 시작 }}start() 메서드 : 쓰레드를 시작하고, 내부적으로 run() 메세드..

BE/Java 2024.12.22

[Java] StringBuffer, StringBuilder

문자열을 조작하는데 사용하되는 클래스1. StringBuilder 와 StringBuffer 의 공통점1.1. 가변 문자열`String`클래스는 불변이다. 즉, 문자열을 수정하면 새로운 문자열 객체를 생성한다반면, `StringBuilder`, `StringBuffer`는 가변적으로 설계되어 한 객체에서 문자열을 직접 수정할 수 있다메모리 효율성을 높이고, 문자열을 자주 수정하는 작업에서 더 빠른 성능을 제공한다2. 차이점특성`StringBuilder``StringBuffer`쓰레드 안정성비동기적으로 동작 (쓰레드 안전 아님)동기화 처리속도더 빠름동기화로 인해 약간 느림사용 상황단일 스레드 환경에서 사용멀티 스레드 환경에서 사용쓰레드 안전(Thread-Safe) : 여러 스레드가 동시에 같은 객체를 조작..

BE/Java 2024.12.19