본문 바로가기

[JAVA] Effective Java - 3. private 생성자나 열거 타입으로 싱글턴 보증 싱글턴이란? 인스턴스를 하나만 생성할 수 있는 클래스를 말한다. 상태를 가지지않는 객체나 설계상 유일한 시스템 컴포넌트에 적합하다. 싱글턴을 만드는 방법은 3가지 이다 1. 유일한 인스턴스에 접근 가능한 public static final public class Elvis { public static final Elvis INSTANCE = new Elvis(); private Elvis() { } public void print() { System.out.println("Elvis"); } } public static final 필드인 Elvis.INSTANCE를 초기화 할 때 생성자가 한번만 호출된다. public 이나 protected 생성자가 없으므로 Elvis의 클래스가 초기화할 때 만들어진 인..
[JAVA] Effective Java - 2. 점층적 생성자, 자바 빈즈, 빌더 패턴 매개변수가 많다면 빌더를 고려하라 매개변수의 수가 많으면 기존 정적 팩터리 메서드와 생성자 모두 대응이 어려움. 이때, 기존 대응 방법과 한계를 먼저 설명. 1. 점층적 생성자 패턴 class Order { private String first; // 필수 private String second; // 필수 private String third; // 선택 private String fourth; // 선택 public Order() { } public Order(String first, String second) { this(first, second, null, null); } public Order(String first, String second, String third) { this(first, ..
[JAVA] Effective Java - 1. 정적 팩터리 메서드 public 생성자 보단 정적 메서드로 제공하는 것이 유리하다. 장점 1. 이름을 가질 수 있다. SecurityContext securityContext = SecurityContextHolder.createEmptyContext(); 여기서 빈 SecurityContext 객체를 생성한다는 것을 직관적으로 알 수 있다. 반환될 객체의 특성을 쉽게 묘사 가능 장점 2. 호출 될 때 마다 새로운 객체생성을 하지 않아도 된다. class ColorCollect { private static final Map colorMap = new HashMap(); public static Color getColor(String colorName) { Color color = colorMap.get(colorName)..
[JPA] Proxy 객체 / 지연 로딩(LAZY), 즉시 로딩(EAGER) Proxy 객체 - 실제 객체를 상속받아 만들어지는 객체 - 실제 객체를 참조(Target)를 보관 - Proxy 객체 메서드 호출 시 실제 객체의 메서드 호출 - 실제 사용시 초기화 (DB 조회) Member refMember = em.getReference(Member.class, 1L); // Proxy 객체 불러옴 refMember.getName(); // 초기화 -> em.find는 실제 객체를 불러옴 em.getReference() != em.find() 지연 로딩 (LAZY) - 조회 시 실제 객체가 아닌 Proxy 객체를 가져옴 - 실제 사용하는 시점에서 초기화 (DB 조회) @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "TEAM_ID")..
[JPA] 기본 키 자동 생성 - @Id, @GenarateValue 전략 Entity에서 기본키를 매핑 @Id 만 사용할 경우 직접 할당 @Id private Long id; 사용 시 Member member = new Member(); member.setId(1L); member.setUsername("memberA"); // 영속 em.persist(member); @GenerateValue를 사용하여 자동 할당 가능 Member member = new Member(); member.setUsername("memberA"); // 영속 em.persist(member); // id 자동 생성 4가지 전략이 존재한다. - IDENTITY DB에 위임하는 방식 ex) Mysql - AUTO_INCREMENT @Id @GeneratedValue(strategy = Generat..
[JAVA] JVM 구조와 동작 2 (Runtime Data Area, Garbage Collector) Runtime Data Area JVM의 메모리 영역으로 크게 Method Area, Heap Area, Stack Area, PC Register, Native Method Stack 5개의 영역으로 나뉜다. Method Area 클래스의 이름, 타입, 멤버변수, 접근제어자, 메소드 이름, 파라미터 타입, 리턴타입 등 클래스 레벨의 정보들이 저장된다. 이 영역에는 Runtime Constant Pool이라는 별도의 관리 영역이 존재하는데, 이 공간은 상수 자료형을 저장해 참조하고 중복을 막는 역할을 한다. -> 모든 Thread가 공유하는 영역 Stack Area 런타임 중 Method 호출시 각 생성되어 사용되는 영역, 지역변수, 파라미터, 리턴값 등의 정보가 저장된다. Method 종료시 해당 St..
[Mysql] Public Key Retrieval is not allowed Error Public Key Retrieval is not allowed Mysql 8.0버전 이후부터 접속시 옵션을 useSSL=false를 주고 allowPublicKeyRetrieval=true를 주지않아서 생기는 에러 옵션을 주면 해결됨 Spring DB 접속정보 예) spring.datasource.url=jdbc:mysql://localhost:3306/SHOP_DB?useSSL=false&allowPublicKeyRetrieval=true
[JAVA] JVM 구조와 동작 1 (JVM, Class Loader, Execution Engine) JVM (Java Virtual Machine) Java Byte Code가 실행 될 수 있는 가상머신을 말한다. 여기서 Java Byte Code란 자바 컴파일러를 통해 *.java -> *.class 파일로 컴파일된 class 파일을 말한다. 운영체제의 종류에 관계 없이 실행 될 수 있다. 크게 구조로는 Class Loader, Execution Engine, Garbage Collector, Runtime Data Area로 구분된다. Class Loader 자바 컴파일러를 통해 컴파일된 Java Byte Code(=*.class)를 JVM이 운영체제로 부터 할당받은 메모리(=Runtime Data Area)로 적재(로딩, 링크, 초기화) 해준다. 컴파일 단계가 아닌 "실행" 중에 동작함! - 로딩..