Skills 68

Java - 인스턴스화를 막으려면 private 생성자를 사용하라

Java로 코드 작성 시, 정적 메서드와 정적 필드만을 담은 클래스를 만드는 경우가 종종 있습니다. 예를 들어, java.lang.Math와 같이 기본 타입 값이나 java.util.Array처럼 배열 관련 메서드를 모아놓을 수 있습니다. 또한 java.util.Collections처럼 특정 인터페이스를 구현하는 객체를 생성하는 정적 메서드를 모아놓을 수 있고, final 클래스와 관련된 메서드를 모아놓을 때 사용합니다. (final 클래스를 상속하여 하위 클래스에 메서드를 넣는 것은 불가능) 하지만 위에서 나열한 정적 멤버만을 담은 utility class는 인스턴스로 만들어 쓰려고 설계한 것이 아닙니다. 정적 멤버만 담은 uility class에 생성자를 명시하지 않으면 JVM이 기본 생성자를 자동으..

Skills/Java 2022.10.30

Java - private 생성자나 열거 타입으로 싱글턴임을 보증하라.

Singleton은 애플리케이션이 실행될 때, 어떤 클래스에 최초 한번만 메모리를 할당하고, 그 메모리에 인스턴스를 만들어 사용하는 패턴입니다. 최초로 한번만 할당했기 때문에 여러번 호출되어도 실제로 생성되는 객체는 하나이며, 최초로 생성된 이후에 호출된 생성자는 이미 생성한 객체를 반환하도록 만듭니다. 1. 장점과 단점 장점이자 사용 이유는 DB에서 커넥션, 스레드풀, 캐시, 로그 등 공통된 객체를 생성해서 사용하는 상황에 최초 한번만 메모리를 할당하기 때문에 메모리 낭비를 방지할 수 있고, 싱글톤으로 구현한 인스턴스는 '전역'이므로 다른 클래스의 인스턴스들이 데이터를 공유하는 것이 가능합니다. 다만 이러한 싱글톤 패턴으로 인스턴스를 생성하게 되면, 싱글톤 인스턴스가 너무 많은 역할을 하게되고 이러한 ..

Skills/Java 2022.10.25

Java - 생성자에 매개변수가 많다면 Builder를 고려하라

이펙티브 Java의 2장은 제목과 같이 Builder 패턴에 대해 설명합니다. item 1에서 설명한 생성자와 정적 팩토리 메서드에서는 공통적으로 매개변수가 많다면 대응하기 힘들다는 포인트가 있었습니다. 이를 Builder를 통해 어떻게 개선하는지 패러미터를 어떻게 깔끔하게 처리하는지 알아보겠습니다. 1. 생성자 패턴 Buidler 설명에 앞서, 생성자 패턴의 맹점을 알아보겠습니다. public class Nutrition { private final int calroies; private servings; private final fat; private final int sodium; public Nutrition(int calroies, int servings) { this(calroies, serv..

Skills/Java 2022.10.19

Java - JDBC Transaction

1. Transaction과 Lock 트랜잭션은 DB 상태를 변화시키기 위해 수행하는 작업의 단위로 이전에 작성한 글에서 용어를 정리했었습니다. 간단하게 정리하자면 DB의 상태를 변화(SQL 질의)시키기 위해 수행하는 작업의 완전성을 위해, 작업을 완벽하게 처리하거나 혹은 처리하지 못할 경우에 원 상태로 복구하여 작업의 일부만 적용되지 않도록 해주는 기능을 말합니다. 사용자가 DB에 접근하기 위해서는 Spring의 WAS 서버나 DB 접근 툴(H2 console)과 같은 클라이언트를 통해 DB에 접근할 수 있습니다. 이 때, 클라이언트는 DB 서버에 연결을 요청하고 커넥션을 맺게되는데 DB 서버는 내부에 세션이라는 것을 만들어 모든 요청을 세션을 통해 실행하게 됩니다. 한 세션에서 트랜잭션 처리를 하는 ..

Skills/Java 2022.10.18

Java - 커넥션 풀과 데이터소스

1. JDBC DriverManager Java에서는 JDBC 인터페이스를 각 DB벤더에 맞도록 구현해서, 개발자가 사용하는 벤더의 DB에 맞도록 구현하여 JDBC 드라이버를 제공합니다. 그 중, JDBC 인터페이스의 DriverManager는 각 벤더에 맞는 DB의 드라이버들을 관리하여 커넥션을 획득하는 기능을 제공을 합니다. DriverManager의 getConnection() 메서드를 통해 벤더의 드라이버에 커넥션을 요청하고, 라이브러리에 등록된 드라이버의 목록을 자동 인식하여 정보를 넘겨서 커넥션을 획득할 수 있는지 확인합니다. API를 살펴보면, url(jdbc:Driver 종류://IP:포트번호/DB명), user(DB의 ID), password(DB의 비밀번호)를 받도록 되어있습니다. 각 ..

Skills/Java 2022.10.13

AWS - EC2 인스턴스 생성하기

22년 10월 1일부터 AWS EC2 UI가 변경되어서 정리 차원에서 적어봤습니다. 1. EC2에 접속 좌측 메뉴에서 인스턴스 -> 인스턴스 시작을 눌러줍니다. 1.1 VPC 생성 EC2 생성을 위해서는 VPC와 서브넷이 필수입니다. VPC(Virtual Private Cloud)와 서브넷이 없다면 EC2 인스턴스는 서로 거미줄처럼 인터넷과 연결되는데, 이렇게 한다면 시스템이 복잡해지고 모든 인스턴스를 수정해야하는 귀찮은 점이 생기게됩니다. VPC를 적용하면 VPC별로 네트워크를 구성할 수 있어 이를 해결할 수 있습니다. VPC에서 VPC를 먼저 생성해줍시다. 2. 정보 입력 2.1 이름 및 태그 인스턴스 시작에 들어오면 저런 화면이 나옵니다. 먼저 이름 및 태그에 자신 프로젝트의 이름을 적어줍니다. 2..

Skills/AWS 2022.10.12

Java - static 키워드의 사용

얼마전 스터디에서 제가 Static 키워드에 대해 설명하던 도중 잘못알고 있던 부분이 있어 바로 잡으려고 글을 작성했습니다. 1. Static Java의 static keyword는 주로 메모리 관리에 사용되는 키워드로 주어진 클래스의 동일 변수나 메서드를 공유하는데 사용이 됩니다. 멤버(블록, 변수, 메서드, 클래스)가 정적으로 선언되면 해당 클래스의 개체가 생성되기 전(컴파일 타임)에 개체에 대한 참조없이 접근할 수 있습니다. Java에서 일반적으로 만든 Class는 Static 영역에 생성되고, new 연산자를 통한 객체 생성은 Heap 영역에 저장이 됩니다. 객체 생성 시 Heap 영역의 메모리는 GC의 관리를 받게 되는데, Static 영역에 할당된 메모리는 모든 객체가 공유하는 메로리로 GC의..

Skills/Java 2022.10.11

Java - 정적 팩토리 메서드를 고려하는 상황

조슈아 블로치의 Effective Java는 1장에 나오는 '생성자대신 정적 팩토리 메서드를 고려하라'는 주제로 시작됩니다. 생성자대신 사용하라는 것은 두 개 모두 클래스의 인스턴스를 얻는 수단이기 때문이죠. 둘을 비교하면서 살펴보겠습니다. 1. 정적 팩토리 메서드 (Static Factory Method) 먼저 정적 팩토리 메서드는 해당 클래스의 인스턴스를 반환하는 클래스 메서드입니다. 설명보다는 코드로 한번 보는 것이 좋을 것 같습니다. // 생성자 방식 public class Constructor{ String cons; public cons(String name){ this.name=name; } public static void main(String[] arts){ Constructor cons..

Skills/Java 2022.10.08

Java - JDBC

1. JDBC JDBC는 Java DataBase Connectivity의 약자로 Java 프로그램과 DB와 연결되어 주고 받을 수 있게 돕는 Java API로 DB에서 데이터를 쿼리하거나 업데이트 하는 방법을 제공합니다. 소개에 앞서 JDBC가 등장하게 된 배경부터 살펴봐야 될 것 같습니다. 애플리케이션을 개발시 중요 데이터는 DB에 보관하게 됩니다. 이 때 클라이언트가(App 혹은 브라우저에서) 애플리케이션 서버에 요청을 보내게 되면 비즈니스 로직을 수행하여 필요 데이터를 SQL로 전달하여 DB에 전달하게 됩니다. 위의 설명을 그림으로 요악하면 그림과 같습니다. 여기서 문제가 있습니다. DB의 종류에는 여러가지가 있어(MySQL, Oracle, Maria 등등.. ) DB마다 커넥션 연결하는 법, S..

Skills/Java 2022.10.04

Java - equals(), hashcode() 메서드의 사용

Java에서는 두 객체를 비교할 때 사용하는 메서드로 equlas()가 있는데 각 차이점을 알아보겠습니다. 1. Object class 설명에 앞서 Object class에 대해 짚고 넘어가겠습니다. 클래스 선언 시 extends 키워드로 상속하지 않는다면 java.lang.Object 클래스를 상속하게 됩니다. 이는 무엇을 의미하느냐 Java의 모든 클래스는 Object 클래스의 Super 클래스거나 sub클래스라는 의미입니다. Object 클래스에는 필드가 없고 메서드로만 구성되어 있는데, 이 메서드들이 모든 클래스가 Object를 상속하기 때문에 모든 클래스에서 사용이 가능한 것입니다. Java 공식 문서를 보면 getClass, hashCode, equals, clone, toString .. 등..

Skills/Java 2022.10.01