Java Reflection 리플렉션 이란? 리플렉션은 Java의 기능으로 구체적인 클래스 타입을 알지 못하더라도 그 클래스의 메서드, 필드, 타입 등에 접근할 수 있도록 도와주는 API이다. 리플렉션은 직접 접근할 수 없는 private 인스턴스 변수와 메서드에 접근할 수 있다. 리플렉션의 사용처 리플렉션은 클래스를 런타임에 동적으로 사용해야 할 때 필요하다. 컴파일 시점에는 어떤 클래스를 사용해야 할지 모르는 경우 런타임 시점에 클래스를 가져와서 실행해야 할 때 사용한다. 대표적으로 사용되는 곳으로는 IntelliJ의 자동완성, Hibernate, Spring Framework의 BeanFactory 등의 프레임워크나 라이브러리에서 주로 사용되고 있다. 리플렉션의 원리 Java에서는 모든 .class..
학교 팀 프로젝트 진행 중 project 테이블에 mockaroo를 이용해서 더미 데이터를 넣는 작업을 진행했는데, project 생성 시 project_team 테이블에 해당 project의 리더 id가 insert 되어야 했다. 1000개의 row에 수작업으로 일일이 넣어주는 건 엄두가 안 나서 MySQL의 저장 프로시저(Stored Procedure)를 사용하기로 했다. 우선 저장 프로시저가 무엇인지 정의부터 알아보고 사용한 프로시저의 내용을 설명하겠다. 저장 프로시저(Stored Procedure)란? 저장 프로시저는 일련의 쿼리를 마치 하나의 함수처럼 실행하기 위한 쿼리의 집합이다. DB에 대한 일련의 작업을 정리한 절차를 RDBMS에 저장한 것으로 영구 저장 모듈이라고도 불린다. 저장 프로시저..
탄력적 IP 주소 탄력적 아이피 주소는 동적 클라우드 컴퓨팅을 위해 고안된 정적 IPv4 주소로 인스턴스에 고정 IP를 설정하고 싶을 때 사용한다. 탄력적 IP 없이 인스턴스를 사용하면 동적 IP가 할당되기 때문에 인스턴스를 중지시켰다가 실행하거나 인스턴스를 새로 생성해서 사용해야 할 때 IP가 변경되어 불편함을 겪을 수 있다. 이럴 때 탄력적 IP를 사용하면 인스턴스 상태에 영향을 받지 않고 외부에서 접근 가능한 고정 퍼블릭 IPv4 주소를 사용할 수 있다. 프리티어 탄력적 IP 주소 요금 프리티어 사용자의 경우 인스턴스에 연결된 탄력적 IP 주소를 무료로 한 개 사용할 수 있다. 이때 주의해야 할 점은 탄력적 IP 주소가 1개여도 실행 중인 인스턴스에 연결되어 있지 않거나, 중지된 인스턴스 혹은 연결..
Spring Boot로 작업한 프로젝트를 배포하기 위해 AWS 설정 과정을 차례대로 포스팅하려 한다. 첫 번째로 해야 하는 일은 EC2 인스턴스를 생성하는 일이다. 인스턴스 생성 시작 AWS 콘솔 홈에 솔루션 구축 메뉴에 있는 EC2 가상 머신 시작 또는 서비스에 EC2에서 인스턴스 시작 메뉴를 눌러 인스턴스 생성을 시작한다. 애플리케이션 및 OS 이미지 이름 및 태그는 EC2 인스턴스를 구별할 수 있는 이름으로 설정해준다. 그리고 애플리케이션 및 OS 이미지는 Amazon Linux 또는 Ubuntu를 많이 사용하는데 본인이 원하는 OS를 선택하면 된다. 여기서는 Ubuntu를 선택했다. 인스턴스 유형 AWS 프리티어의 경우 인스턴스 유형을 반드시 t2.micro로 선택해주어야 과금을 방지할 수 있다...
Servlet 서블릿이란 클라이언트 요청을 처리하고, 그 결과를 반환하는 웹 프로그래밍 기술로 자바로 구현된 CGI (Common Gateway Interface)이다. 이전의 웹 프로그램들은 클라이언트의 요청에 대한 응답으로 이미 만들어진 정적인 페이지를 넘겨주었지만 웹 프로그래밍이 발전하면서 동적인 페이지를 제공할 수 있게 되었다. 동적인 페이지를 제공하기 위해서는 웹 서버가 다른 곳에 도움을 요청하여 동적인 페이지를 작성해야 한다. 여기서 웹 서버가 동적인 페이지를 제공할 수 있도록 도와주는 어플리케이션이 서블릿이며, 동적인 페이지를 생성하는 애플리케이션이 CGI이다. Servlet의 특징 클라이언트의 요청에 대해 동적으로 작동하는 웹 어플리케이션 컴포넌트 html을 사용하여 요청에 응답한다. Ja..
Java에서 Key-Value 쌍을 저장하는 자료구조로 HashTable과 HashMap이 있다. HashTable 또는 HashMap을 사용할 때 키와 키에 연결하려는 값을 지정하면 키가 해시되고 결과 해시코드가 테이블 내에서 값이 저장되는 인덱스로 사용된다. 그렇다면 기본적인 구조는 비슷한 두 자료구조의 차이점은 무엇인지 알아보도록 하자 HashMap vs HashTable HashMap은 동기화되지 않기 때문에 thread-safe 하지 않아 싱글 스레드 환경에서 사용하는 것이 좋다. HashTable은 동기화를 보장하여 멀티 스레드 환경에서 thread-safe 하다. HashMap은 하나 또는 여러개의 null 키를 허용하는 반면 HashTable은 키 또는 값에 null 값을 허용하지 않는다...
Spring Data JPA 원하는 필드만 Select 하기(Projection) JPA를 사용해서 Repository에서 Select 할 때, 보통 Entity를 통째로 조회하게 되는데, 일부 값만 필요한 경우 불필요한 데이터까지 모두 조회하게 된다. 오늘 진행하고 있는 프로젝트 기능 중에서 회원의 점수별로 정렬하여 조회하는 쿼리가 필요했는데, Member의 모든 필드를 가져올 필요가 없다고 생각하여 Projection을 사용해 보았다. Projection을 사용해서 원하는 필드만 가져올 수 있는데 기본적인 방법은 인터페이스를 이용하여 Projection 하는 방법이지만, DTO Class를 많이 사용하기 때문에 Class Projection도 사용이 가능하다. 오늘은 두 방법에 대해 알아보도록 하자...
Item1. 생성자 대신 정적 팩토리 메서드를 고려하라 클래스는 클라이언트에 public 생성자 대신 (혹은 생성자와 함께) 정적 팩토리 메서드를 제공할 수 있다. 이 방식에는 장점과 단점이 모두 존재한다. 장점 1. 이름을 가질 수 있다. class BigInteger { //public 생성자 방식 public BigInteger(int bitLength, int certainty, Random rnd) { BigInteger prime; if (bitLength < 2) throw new ArithmeticException("bitLength < 2"); prime = (bitLength < SMALL_PRIME_THRESHOLD ? smallPrime(bitLength, certainty, rnd..