본문 바로가기

기초 지식

(27)
[MyBatis] 마이바티스의 #{}, ${} 차이 ? : 마이바티스에서 #하고 $ 차이 알아요? Me : .....iBatis에서 #으로 썼었나? 저는 마이바티스를 처음 알고 쓴지가 1년 반 정도 된것 같습니다. 근데 정말 아무 생각 없이 쓰다가 최근데 #하고 $의 차이를 아냐는 질문을 듣고 정신이 나가버렸습니다. 질문을 듣자마자 "음..? #{parameter} 이렇게 쓴거 같은데 $도 있었나?" 이렇게 생각이 들고 iBatis에서 $를 쓴거 같기도 하더라구요. 그래서 그냥 버전의 차이 아닌가요?라는 답답한 답변을 해버리고 말았습니다. 1년 반동안 정말 아무 생각도 없이 쓰기만 했네요 ㅎㅎ SELECT ${COLUMN} FROM USER WHERE user_id = #{userId} MyBatis에서 $,#을 사용한 예시입니다. 위의 SQL을 보기전에..
DB의 결합 인덱스에 관해서 분명히 결합인덱스에 포함이 되어있는데 왜 인덱스를 타지 않지??! 최근에 일을 진행하면서 기존 쿼리가 인덱스를 여러개 추가했음에도 인덱스를 사용하지 않고 Table Full Scan을 하는 경우가 발생했습니다. 문제의 원인은 인덱스를 여러개를 충분히 추가해두긴 했지만 결합인덱스에서 우선 설정되지 않은 컬럼으로 조회 조건이 적용되면서 발생한 이슈였습니다. 이번 일로 인해 결합인덱스에 대해 공부가 필요할 것 같아서 간단하게 정리해보겠습니다. 결합인덱스 (Composite Index) 결합인덱스란 복수의 컬럼으로 구성된 인덱스로 복수의 컬럼으로 묶었을 때 데이터 분포도가 좋아지는 경우 사용됩니다. //결합 인덱스 생성 구문 예시 CREATE INDEX idx_composite_index_1 ON Test(id..
[Java 15 ~] Record Java Record 자바 14에서 preview로 등록되었고 자바 16 버전에 정식으로 새로운 기능으로 Record Type이 추가되었습니다.(나모찾기님 수정) 내용을 간단하게 설명하자면 기존의 POJO 객체를 만들 때 get~, set~ 이런 식으로 잡다하게 붙여줘야 할 일을 줄여주는 Type입니다. 기능 모든 프로퍼티를 포함한 생성자 제공 모든 프로퍼티에 private final 적용 모든 프로퍼티의 getter 메소드 생성 toString, equals, hashCode 메소드 생성 프로퍼티들에게 annotation을 붙일 수 있도록 허용 사용법 //Record를 사용하지 않은 클래스 public class Car { private final String name; private final int..
JVM에 관하여 Java는 쓰는데 JVM이 뭐지? Java를 사용하는 데에는 아주 간단한 과정이 있습니다. 자신의 OS에 맞는 JDK를 설치하고 내가 짠 Java 코드를 javac 명령어로 실행시키면 프로그램이 구동됩니다. 근데 이러한 과정은 맥, 윈도우, 리눅스 모두 같은 과정을 거쳐서 사용할 수 있습니다. 이것은 Java 언어의 특성이자 JVM을 이용해서 가능한 일입니다. JVM이란? Java Virtual Machine 자바 바이트 코드를 해석하고 실행 자바 애플리케이션을 클래스 로더(Class Loader)를 통해 읽어서 자바 API와 함께 실행 자바의 WORA(Write Once Run Anywhere) 컨셉을 위해 사용되는 소프트웨어 JVM은 우리가 흔히 사용하는 프로그램들과 똑같은 소프트웨어입니다. 단지 자..
[Java] Checked Exception, Unchecked Exception 1. Checked Exception, Unchecked Exception이란 자바로 열심히 코딩을 하다보면 여러가지 Exception(예외)들을 만납니다. 실무에서뿐만 아니라 코딩테스트를 풀다가도 자주 만나는 Exception으로는 NullPointException, ArrayIndexOutOfBoundsException 등이 있습니다. 그렇다면 앞의 두 예시는 어떤 상황에서 발생할까요? 보통은 컴파일 시에는 발생하지 않습니다. 그랬다면 이미 알고 수정했을겁니다. 그렇다면 실행도중에 발생한 예외일겁니다. 그럼 Runtime 시점에 발생했으니 RuntimeException일겁니다. 이것들은 우리가 프로젝트를 실행할 때는 전혀 문제가 없습니다. 그래서 굳이 에러가 발생할 상황이 만들어지지 않는다면 체크할 ..
[Java] String 선언 방식에 따른 차이 String을 사용할 때 2가지 방식으로 선언할 수 있는데 어떤 차이가 있을까요? Java에서 String은 Reference 타입 중 가장 많이 사용되지 않을까 생각됩니다. 그런데 잘 알지도 못하고 사용하고 있다고 위의 질문을 들었을 때 알게 되었습니다. 그리고 Java책을 다시 펴보게 됐네요 ㅎㅎ public class Test { public static void main(String [] args) { String init1 = new String("init1"); String init2 = "init2"; String init2_2 = "init2_2"; } } String을 사용할 때 보통은 init2의 방식대로 사용하겠지만 위의 방식도 가능합니다. 중요한 차이점은 JVM에서 관리하는 메모리 ..
메모리 구조와 Stack / Heap 메모리 1. 메모리 구조 애플리케이션을 개발하고 서버에 띄우게 되면 OS가 RAM 메모리를 할당해주고 그 곳에 로드되게 됩니다. 이때 OS로부터 할당받는 메모리는 4가지 영역으로 나누어집니다. Code(코드) 영역 프로그램의 코드가 저장되는 공간입니다. Data(데이터) 영역 전역 변수와 정적 변수가 저장되는 공간입니다. 프로그램 시작과 함께 할당되고 프로그램이 종료되면 해제됩니다. Stack(스택) 영역 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 공간입니다. 함수의 호출과 함께 할당되며 함수 호출이 종료되면 해제됩니다. 메모리의 높은 주소에서 낮은 주소 방향으로 할당됩니다. Heap(힙) 영역 사용자에 의해 동적으로 할당되고 해제되는 공간입니다. Java - new, c - realloc 등을 사..
[Java] Java Primitive Type VS Reference Type Java에서는 기본형 타입과 참조형 타입이 있습니다. 저도 너무나 자연스럽게 사용하고 있지만 아래의 질문을 받으니 대답 할 수가 없었습니다. Java에서 Primitive Type, Reference Type은 메모리 어디에 저장이 될까요? 이에 대한 정답은 아래에 정리하겠습니다. 1. Primitive Type (기본형 타입) 기본값이 NULL이 아닌 값들로 이루어져있다. 실제 값을 저장하고 메모리는 스택(Stack) 메모리에 저장된다. 컴파일 에러를 발생시킨다. 타입 메모리 크기 기본값 표현 범위 boolean 1 byte false true, false byte 1 byte 0 -128 ~ 127 short 2 byte 0 -32,768 ~ 32,767 int 4 byte 0 -2,147,483,6..
[Java] Java의 날짜, 시간 클래스는 어떻게 편해졌나 Java 1.7까지는 기본 SDK에서 날짜와 시간을 표현하고 사용하기 위해서는 java.util.Date 클래스와 java.util.Calendar 클래스를 이용해야 했습니다. 하지만 아주 잠깐만 사용해봐도 어마어마하게 불편하다는 것을 알 수 있습니다. 그래서 나온것이 Joda-Time이라는 오픈소스 라이브러리였고 Java 8에서는 드디어 개선되어서 적용되었습니다. 그러면 어떻게 좋지 않았고 어떠한 사항이 개선되었는지 확인해보겠습니다. 우선 아주 잘 정리된 Naver D2의 게시글을 공유해드립니다. 저의 게시글은 아래 링크의 글에 기반으로 한 글입니다. 그런데 정리를 곁들인. d2.naver.com/helloworld/645609 1. JDK 1.8 미만의 날짜 계산 단점 사용시 착오가 생길 수 있는 부..
Java 1.8 Optional Optional Optional을 사용하지 않을 때는 메서드의 결과값이 null일 경우를 체크하고 분기를 나눠서 처리해야 했습니다. 코드가 지저분해지고 길어졌죠. Optional을 사용하면 조금 더 직관적으로 표현할 수 있습니다. 메서드가 반환할 결과값이 '없음'을 명확하게 표현하고, null을 반환하면 에러를 유발할 가능성이 높은 상황에서 Optional을 반환 타입으로 사용하는 것이 목적이다. 위의 목적에 맞는 사용법을 추구하여 사용해야겠습니다. 1. 기본 사용 예시 //null이 반환된 메소드 String isNullString = testBO.getString(); //기존 null 체크 방식 String retValue = ""; if (isNullString == null) { retValue..