멋진 개발자/Java & Spring

이전에 JVM의 구조와 특징에 대한 글을 게시한 적이 있다. (https://skroy0513.tistory.com/22)그중 실행 엔진에 대해서 좀 더 자세히 알아보고자 공부해 보았다.실행 엔진 (Execution Engine) 이란JVM은 Java 컴파일러가 컴파일한 바이트 코드를 Class Loader를 이용해 메모리(Runtime Data Area)에 실행 가능한 상태로 적재한다.실행엔진은 메모리에 할당된 바이트 코드를 실행하는 역할을 담당한다. 기존의 .java 파일인 소스코드는 기계가 읽을 수 없는 언어이기 때문에 컴파일러가 .class인 바이트 코드로 변환을 해 준 뒤, 실행 엔진은 해당 바이트 코드를 한 줄씩 읽어 실행하는 인터프리터, JIT 컴파일러, 가비지 컬렉터 등의 동작으로 바이트 ..
자바 빈(Java Bean)이란?데이터를 표현하기 위한 목적을 지니고 있으며, 특정한 정보 (id, password, name, job..) 등을 가지고 있는 클래스를 표현하는 하나의 규칙이고, 이러한 규칙을 지닌 클래스를 Java Bean이라고 한다.  자바로 작성된 컴포넌트들, 즉, 클래스를 가리키는 뜻으로 사용된다.DTO, VO 등의 형태가 Java Bean이라고 생각하면 쉽다.Java Bean의 규약반드시 클래스는 패키지화되어야 함멤버 변수는 property(프로퍼티)라고 함멤버 변수는 private로 지정하고, getter / setter를 통해서만 외부 접근이 가능해야 한다.getter / setter는 public으로 지정해야 한다.인자가 없는 생성자가 존재해야 한다. (NoArgsConst..
https://skroy0513.tistory.com/70 개발자 성장 기록 51 - MyBatisMyBatis MyBatis는 SQL Mapper Framework이다. 개발자들은 MyBatis를 사용해서 JDBC 코드의 복잡하고 지루한 작업을 피할 수가 있다. MyBatis를 통해 간단한 key로 SQL문을 매핑하여 사용할 수도 있다. 또한 기존의skroy0513.tistory.com위 포스팅에 이어서 오늘은 MyBatis의 동적쿼리를 알아보도록 하자. 동적 쿼리란, 런타임 중에 조건에 따라 쿼리를 생성하고 실행하며 상황에 따라 다른 문법의 SQL을 적용하는 것을 말한다.동적 쿼리를 사용하면 사용자의 입력이나 프로그램의 상황에 따라 쿼리가 동적으로 변할 수 있다.test 속..
웹페이지는 정적 페이지와 동적 페이지로 나눌 수 있다. 정적 웹페이지는 웹서버에 저장된 .html 파일을 검색해서 문서 그대로 전달하여 브라우저에 보여준다. 동적 웹페이지는 저장된 내용을 다르게 가공하여 보여주는 방식이다.클라이언트가 웹 페이지를 요청하면 서버가 그 요청을 분석하여 응답결과를 HTML 문서로 만들어서 브라우저를 통해 보여준다.JSP (Java Server Pages)JSP는 HTML코드에 Java 코드를 사용하여 동적 웹페이지를 생성하는 웹 애플리케이션 라이브러리이다.JSP가 실행되면 Java Servlet으로 변환되어 웹 애플리케이션 서버에서 동작하게 되며, 생성된 데이터들을 웹페이지와 클라이언트를 통해 응답을 한다. JSP 동작과정브라우저가 웹 서버에게 JSP에 대한 요청 정보를 전달..
동일성 (Identity) 두 객체가 완전히 같은 경우를 말한다. 완전히 같은 경우라는 것은 Stack에 저장된 변수가 Heap 영역의 객체들 중 같은 객체의 주소를 가리키고 있다는 것이다. 즉, 같은 객체의 주소값을 바라보고 있는지를 비교하는 것이다. 위 그림에서 refVar2와 refVar3는 같은 객체(객체2)를 바라보고 있으므로 두 변수가 가리키는 객체는 동일하다고 말할 수 있다. 두 객체가 동일한지 아닌지는 == 연산자를 통해 판별할 수 있다. int, double, char 등의 Primitive 타입은 따로 객체를 가지지 않기 때문에 == 연산자를 사용하여 비교했을 시 같으면 true를 리턴한다. 동등성(Equality) 두 객체에 저장된 값이 같은 값인 경우를 의미한다. 동등성은 변수가 참..
MyBatis MyBatis는 SQL Mapper Framework이다. 개발자들은 MyBatis를 사용해서 JDBC 코드의 복잡하고 지루한 작업을 피할 수가 있다. MyBatis를 통해 간단한 key로 SQL문을 매핑하여 사용할 수도 있다. 또한 기존의 SQL문을 그대로 활용이 가능하고, 진입장벽이 낮은 편이어서 JDBC의 대안으로 많이 사용된다. 구성요소 MapperConfig XML 파일 : myBatis의 환경설정 파일 Mapper 인터페이스 : 데이터베이스 액세스 작업이 정의된 인터페이스 Mapper XML 파일 : Mapper 인터페이스의 메서드를 참조해서 작성한 매핑된 SQL 구문이 정의된 파일 개발 순서 1. 의존성 라이브러리 추가 spring-core spring-jdbc mybatis ..
접근제어자 클래스와 클래스의 멤버(변수, 메서드, 생성자)를 사용할 때, 접근할 수 있는 범위를 지정해 주는 역할을 한다. 보통 접근제어자 또는 접근지정자라고 부르며 클래스나 클래스 멤버 앞에 붙어있는 public, private 등의 키워드가 접근제어자이다. 클래스의 접근제어자 클래스를 정의할 때 사용 가능한 접근제어자는 public, default 두 가지이다. public : package에 상관없이 모든 클래스에서 접근이 가능하다. default : 생략이 가능하며, 같은 package 안의 클래스에서만 접근이 가능하다. public class Sample1 {}// public 클래스, 모든 클래스가 접근 가능함 class Sample2 {}// default 클래스, 같은 package안의 클..
Java에서 문자열을 다루는 클래스로는 String, StringBuffer, StringBuilder 가 있다. 연산이 많지 않을 때에는 어떠한 클래스를 사용하더라도 문제가 발생할 가능성은 없지만, 연산 횟수가 많아지거나 멀티스레드, Race Condition 등의 상황이 자주 발생한다면 각 클래스의 특징을 이해하고 상황에 맞는 클래스를 사용하여야 한다. String String 객체의 가장 큰 특징은 immutable(불변)이다. String str = "hello"; str = str + " world"; System.out.println(str);// "hello world" 위 코드를 보면 단지 "hello"가 저장되어 있는 str에 " world"를 붙인 걸로 착각하기 쉽다. 물론 틀린 말은 ..
Concurrent Collection이란 (병렬 컬렉션) Concurrent(병렬/동시성)이란 단어에서 알 수 있듯이 Synchronized 컬렉션과 달리 여러 스레드가 동시에 컬렉션에 접근할 수 있다. (Thread-safe 하다) Synchronized 컬렉션은 하나의 스레드가 접근 시 다른 스레드는 아예 접근이 불가능하지만, Concurrent 컬렉션은 보관하고 있는 데이터를 여러 부분으로 나눠서 Lock을 걸어 다른 부분에 접근 중이라면 여러 스레드가 동시 접근이 가능하다. 여러 스레드가 한 번에 접근 가능하기 때문에 스레드 대기 시간을 줄여주며, Synchronized 컬렉션보다 성능이 높다. 하나 이상의 스레드가 병렬적으로 read, write 연산을 할 수 있다. 종류 java.util.c..
Thread Pool (스레드 풀) 우리는 프로그램을 개발할 때 다양한 이유로 스레드를 생성한다. 비동기 처리의 일환일 수도 있고, 연산 처리의 효율을 높이기 위함일 수도 있다. 하지만 스레드를 계속해서 생성하고 회수하는 일은 시스템적으로 오버헤드가 상당히 큰 일이다. 스레드를 한 번 생성할 때마다 OS가 해당 스레드를 위한 메모리 영역(스택 등)을 확보해 주고, 스레드가 더 이상 필요 없을 땐 다시 이 메모리 영역을 회수하는 작업이 일어난다. 이 작업은 상당히 큰 비용이 발생하는 작업이기 때문에, 스레드를 계속 생성하고 회수하는 작업을 하게 되면 퍼포먼스에 영향을 끼칠 수밖에 없다. 위와 같은 문제를 해결하기 위해 등장한 것이 바로 Thread Pool이다. 스레드가 모여있는 풀장이라고 생각하면 되는데..
직렬화란? 객체를 바이트 스트림으로 바꾸는 것, 즉 객체에 저장된 데이터를 스트림에 쓰기 위해 연속적인 serial 데이터로 변환하는 것이다. 직렬화의 주된 목적은 객체를 상태 그대로 저장하고 필요할 때 다시 생성하여 사용하는 것이다. 역직렬화(Deserialization)는 직렬화의 반대말로, 네트워크나 영구저장소에서 바이트 스트림을 가져와서 객체가 저장되었던 바로 그 상태로 변환하는 것이다. Java 직렬화 사용 법 기본 타입(primitive type)과 java.io.Serialiable 인터페이스를 상속받은 객체는 직렬화를 위한 기본 조건을 충족한다. public class Member implements Serializable { private String name; private String..
현재 Java 버전은 6개월마다 릴리스 되고 있다.(저번달에 22 버전이 릴리스 되었다.) 로드맵을 보면 LTS, non-LTS가 각각 붙어있다. LTS는 Long Term Support로, 오랜 기간 지원하는 특별한 버전의 에디션을 뜻한다. (대부분 LTS 버전을 사용한다.) Java 8 버전을 사용하여 프로젝트를 진행한 회사들이 많이 있고, 최신 IDE나 프레임워크를 사용하는 곳에서는 11, 17 버전을 사용하는 경우가 있다. (Java와 빠질 수 없는 짝꿍인 SpringBoot는 3.0 버전부터 Java 17 이상만 지원한다고 한다.) Java의 하위 호환성 Java는 하위 호환성이 매우 높게 때문에 8, 11, 17 버전 등과 같이 특정 버전만을 학습하지 않아도 된다. Java 5, 8 버전의 프..
'is a kind of ~ 추상클래스', 'be able to ~ 인터페이스' 추상클래스 public abstract class 추상클래스 { private String name;// Field public 추상클래스(String name) {// Constructor this.name = name; } public void 메서드() {};// Method public abstract void 추상메서드();// Abstract Method } class 앞에 'abstract' 키워드를 사용하여 정의하며, 하나 이상의 추상 메서드를 가지는 클래스를 말한다. 추상 메서드를 선언하여 상속을 통해 하위 클래스에서 반드시 구현하도록 강제하는 클래스이다. (추상 메서드를 포함하지 않는 클래스도 abstrac..
HashTable HashTable은 Hash를 이용하여 연관 배열을 구현한 자료구조이다. 해시 함수를 통해 key를 해시값으로 매핑하고, 이 해시값을 인덱스로 하여 value값을 key와 함께 저장하여 검색을 빠르게 하기 위한 자료구조이다. 아래 그림과 같이 key는 이름, value는 전화번호를 저장한다고 가정해 보자 위 그림을 보면 John Smith의 데이터를 저장할 때 index = hash_function("John Smith") % 16을 통해서 index값을 구해내고, array[index] = "521-1234"를 저장한다. hash_function를 통해 key에 대한 index값을 구하고 해당 index값을 주소로 buckets에 값(value)을 저장한다. 이런 형식으로 데이터를 저..
제네릭 (Generic) 자바 제네릭(Generic)은 "데이터의 클래스 타입을 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 지정되는 것"을 의미한다. ArrayList list1 = new ArrayList(); ArrayList list2 = new ArrayList(); ArrayList list3 = new ArrayList(); 위와 같이 List마다 안에 들어갈 객체들이 각각 다를 경우 제네릭을 통해 다양한 자료구조를 사용할 수 있다. 만약 제네릭이 없었다면 String클래스, Integer 클래스 등 하나하나 타입에 맞게 자료구조를 만들어야 한다. 하지만, 제네릭은 이러한 문제를 해결해 준다. 특징 제네릭은 다이아몬드 표기법으로 타입 파라미터를 지정한다. 데이터 타입은 클래스 혹은 인..
개발의 WinG
'멋진 개발자/Java & Spring' 카테고리의 글 목록