전체 글
[JPA] 즉시 로딩 (EAGER) 과 지연 로딩 (LAZY) 차이
엔티티의 관계 필드를 조회할 때 언제 데이터를 가져올지 정하는 정책이다.즉시 로딩은 관련 데이터를 바로 함께 가져오는 방식이다.지연 로딩은 실제 필요할 때까지 관련 데이터를 나중에 가져오는 방식이다.1. 즉시 로딩 (EAGER)@ManyToOne(fetch = FetchType.EAGER) private Department dept;엔티티를 조회하는 순간 관계된 데이터를 같이 가져온다.데이터베이스 쿼리가 JOIN 을 수행하여 한 번에 모든 데이터를 가져온다.관계 필드를 바로 쓸 때 편리하지만 불필요한 데이터가 포함될 수 있다.대형 테이블이 많을 경우 성능 저하와 메모리 사용량 증가를 유발한다.주로 관계 필드가 항상 필요하고 조회 빈도가 높은 경우에 사용한다.2. 지연 로딩 (LAZY)@ManyToOne(..
[Spring] @RequestParam 과 @PathVariable 차이
@RequestParam 은 URL 의 쿼리 스트링에 값을 담는다.예를 들어 ?name=홍길동 처럼 파라미터가 붙는 방식이다.반면 @PathVariable 는 URL 경로 자체에 변수를 넣는다./users/{id} 에서 {id} 위치에 값을 채우는 방식이다.쿼리 스트링은 여러 개를 동시에 받을 수 있다.경로 변수는 URL 구조에 딱 맞는 값만 들어간다.1. @RequestParam@GetMapping("/search")public String search(@RequestParam String query) { return "검색 결과: " + query;}이 코드는 GET 요청 시 ?query=스프링 을 받는다.쿼리 스트링은 여러 파라미터를 나열할 수 있다.예를 들어 ?query=스프링&sort=as..
[CS] TCP 와 UDP 차이
TCP 와 UDP 는 인터넷 통신의 두 가지 핵심 프로토콜이다.두 프로토콜은 목적지가 같지만 동작 방식과 사용처가 완전히 다르다.1. 연결 유무Socket tcp = new Socket(); // 연결 필요DatagramSocket udp = new DatagramSocket(); // 연결 불필요TCP 는 통신 전에 반드시 연결을 맺고 끊는다.연결이 없으면 데이터 전송 자체가 불가능하다.UDP 는 연결 없이 바로 데이터를 날려버린다.빠른 응답이 필요할 때 UDP 가 유리한 이유다.안정성이 최우선이라면 TCP 를 선택해야 한다.2. 데이터 신뢰성byte[] tcpData = "파일 전체".getBytes(); // 순서 보장byte[] udpData = new byte[1500]; // 순서 무관TCP ..
[Java] 추상 클래스와 인터페이스 차이
추상 클래스는 어떤 기능을 구현할지 정의하는 템플릿이다.인터페이스는 외부에서 사용할 수 있는 기능의 약속을 담는다.1. 구조적 차이public abstract class Animal {}추상 클래스는 extends 키워드로 하나만 상속받을 수 있다.인터페이스는 implements 키워드를 통해 여러 개 구현할 수 있다.클래스의 경우 변수나 생성자를 직접 정의해서 사용할 수 있다.2. 메서드 구현 방식abstract void eat(); // 추상메서드만 가능void sleep() {} // 일반메서드 가능추상 클래스는 추상메서드와 일반 메서드를 모두 정의할 수 있다.인터페이스는 자바 8 이전에는 추상메서드만 존재했다.자바 8 이후 default 와 static 메서드가 추가되어 변경되었다.3. ..
[HTTP] GET 과 POST 의 차이
HTTP 의 두 주요 메서드인 GET 과 POST 는 어떤 차이가 있을까?GET 은 서버에 데이터를 요청하는 용도로, POST 는 서버로 데이터를 전송할 때 쓴다.1. 데이터 위치GET /search?q=카트라이더POST /api/logindata: {"id":"user","pw":"1234"}GET 은 URL 에 파라미터를 붙여 데이터를 보낸다.POST 는 HTTP 헤더의 Body 에 데이터를 담아 전송한다.URL 에 데이터가 들어가면 주소창에 그대로 표시된다.POST 는 화면에 노출되지 않아 보안상 유리한 편이다.2. 데이터 길이 제한// GET 은 브라우저마다 한계가 있다.GET /search?q=매우긴문장+여러개... // 에러 발생 가능// POST 는 헤더 설정으로 길이를 늘릴 수 있다.POS..
[Spring] @Component, @Service, @Repository 차이
스프링 빈을 등록할 때 어떤 어노테이션을 써야 할지 고민된다면 이 글을 보자.컴포넌트 스캔으로 자동으로 감지하는 기본 스테레오 타입들이다.1. @Component@Componentpublic class MyBean {}모든 스프링 빈을 등록할 때 쓸 수 있는 가장 일반적인 어노테이션이다.특정 역할을 명시하지 않고 단순히 객체를 관리할 때 사용한다.컨테이너가 이를 스캔해서 빈으로 등록하고 의존성 주입을 처리한다.2. @Service@Servicepublic class UserService {}비즈니스 로직이 포함된 서비스 계층을 정의할 때 쓴다.기능적 의미는 @Component 와 동일하지만 코드 가독성을 높여준다.팀원들이 어떤 클래스가 비즈니스 역할을 하는지 한눈에 알 수 있다.3. @Repository..
[Database] 인덱스를 만들었는데 안 타는 경우
인덱스를 만들었음에도 불구하고 쿼리가 느린 이유는 무엇일까?인덱스는 검색 속도를 높이기 위한 자료 구조지만 모든 조건에서 효과가 있는 것은 아니다.1. select * 사용 시SELECT * FROM users WHERE id = 1;select * 를 쓰면 인덱스 스캔 이후 전체 행을 가져와야 한다.이때 DB 는 인덱스 대신 테이블 전체를 읽는 방식인 Table Scan 을 선택할 수 있다.필요한 컬럼만 명시적으로 선택해야 인덱스를 효율적으로 활용할 수 있다.2. 함수 적용 시SELECT * FROM users WHERE YEAR(reg_date) = 2023;컬럼에 함수를 적용하면 인덱스를 직접 사용할 수 없게 된다.DB 는 먼저 모든 행을 가져와서 함수 계산 후 필터링해야 하기 때문이다.함수 대신 ..
[JavaScript] var, let, const 차이
자바스크립트에서 변수를 선언할 때 무엇을 써야 할지 고민되는가? var, let, const의 핵심 차이는 스코프와 재할당 가능 여부에 있다. 상황에 맞는 적절한 키워드를 선택하는 것이 버그를 줄이는 첫걸음이다.1. 변수의 유효 범위: 스코프(Scope)var는 함수 레벨 스코프를 가진다. 함수 내부에서 선언된 변수만 지역 변수로 인정하며, if문이나 for문 같은 블록 내부에서 선언해도 외부에서 접근이 가능하다. 반면 let과 const는 블록 레벨 스코프를 따른다. 중괄호 `{}`로 둘러싸인 모든 블록을 기준으로 유효 범위가 결정된다.if (true) { var varVariable = 'I am var'; let letVariable = 'I am let'; const constVariable..
ORACLE DB LINK 정의 및 사용 방법
Oracle DB link 란? 말그래도 'LINK', 서로 다른 DB를 연결한다는 뜻.그리고 연결을 위한 타DB 접속설정을 정의하는 오라클 객체 를 DB Link라고 함.그냥 쉽게 다른 DB에 접근하는 걸 DB Link라 이해하면 쉽다.1. 모든 DB LINK 목록 조회SELECT * FROM DBA_DB_LINKS; 2. DB LINK 사용 방법SELECT A.* FROM 테이블명@DB_LINK명 A; 3. DB LINK 두 개이상 조회 방법SELECT A.*, B.* FROM 테이블1명@DB_LINK1명 A, 테이블2명@DB_LINK2명 B WHERE A.ID = B.ID AND A.NO = B.NO
JSON.stringify(value, replacer, space) 설명
JSON.stringify(value, replacer, space) 메서드는 JavaScript 객체를 JSON 문자열로 변환할 때 사용된다.value: JSON 문자열로 변환할 객체. replacer: 포함할 속성을 정의하거나 속성을 변환하는 함수 또는 배열. space: 반환된 JSON 문자열의 가독성을 높이기 위한 공백 또는 문자열 (들여쓰기). const obj = { name: "Alice", age: 30, city: "Wonderland", password: "secret" };// replacer 함수: 'password' 속성을 제외function replacer(key, value) { if (key === "password") { return undefined; } ret..
[Java] 문자열(String) 비교시 equals()와 == 차이
우선 두 가지의 정의 후에 차이를 보겠습니다.1. “equals” 메서드 원래 equals()의 경우 Object 클래스의 메서드이고이는 == 연산자와 동일하게 주소 값을 비교를 수행하는 메서드 이다. 흔히 문자열 비교를 위해 사용하는 equals()의 경우 String 클래스에서 오버라이딩을 함으로써 문자열 간의 비교가 가능하다.2. “==” 연산자== 연산자의 경우 객체의 주소값을 비교합니다.그래서 비교하는 객체가 동일한 객체인지를 판별합니다.Primitive Type의 객체에 대해서는 값 비교가 가능하고,Reference Type에 대해서는 주소 비교를 수행합니다. 정리하면,Primitive Type의 객체는 Constant Pool의 특정한 값을 참조하는 변수이기에,결국 Constant Pool내..
[JavaScript] ==, === 비교 연산자 차이
Javascript를 사용 중에 값을 비교시엔 비교연산자인 ==연산자와 ===연산자를 사용한다. 두 연산자 모두 비교한 피연산자 값이 일치하면 ture값을 반환하고,비교한 피연산자 값이 일치하지 않으면 false를 반환한다. 하지만 값을 비교할 때== 연산자보다는 === 연산자를 사용할 것을 권장하고 있다. 그 이유가 뭘까? == 연산자는 Equal Operator(비교연산자), ===연산자는 Strict Equal Operator(엄격한 비교 연산자)이기 때문이다. 두 연산자를 코드를 통해 쉽게 예를 들어 보자면 아래와 같다. 1. == 연산자100 == 100 // true100 == '100' // true1 == true // truetrue == 'true' ..