[Java] inner class를 static으로 선언해야 하는 이유
·
Java/Java Concept
inner class를 static으로 "반드시" 선언해야 하는 이유가 2가지가 있습니다.  첫째, 위 코드를 기반으로 봤을 때, inner class 바깥 클래스의 인스턴스와 암묵적으로 연결되어 GC의 메모리 수거가 잘 수행되지 않을 수 있습니다. 그래서 Intellij에서 inner class를 non-static으로 선언할 경우, static으로 바꾸라는 경고표시가 생깁니다.  사진과 같이, static으로 선언한 경우 외부 참조를 하지 않는 것을 육안으로 확인할 수 있습니다. 둘째, 이러한 외부 참조를 저장하려면 시간과 공간이 많이 소비됩니다. 그래서 외부 참조를 막을 수 있도록 static 키워드를 붙여주는 것이 합리적입니다.  결론멤버 클래스의 인스턴스 각각이 바깥 인스턴스를 참조해야 하는 상..
[Java] enum 비교에서는 equals(), == 둘 중 어떤 것이 적합한가?
·
Java/Java Concept
enum class에서 비교는 ==가 적합한가 equals()가 적합한지에 대해서 고민해 봤습니다. 자바의 enum class는 singleton이기 때문에, == 비교가 적합하다고 생각했습니다. (equals() 보다 속도도 빠릅니다)왜냐하면 런타임 시점에서의 NPE 방지뿐만 아니라, 컴파일 시점에 타입 호환성까지 check해주는 장점이 있기 때문입니다. equals() 비교를 통해 값을 비교했다면 그대로 컴파일되었을 것이라고 판단됩니다. enum의 class를 뜯어봤을 때, 결정적으로 == 비교를 하는 것을 확인할 수 있습니다. 즉, == 비교를 내부적으로 하고 있지만, 위의 장점들 뿐만 아니라 비교하려는 상수를 앞에 둬야 NPE를 방지할 수 있는 번거로움을 없애려면 == 비교가 적합하다고 생각합니다..
[Java] ProcessBuilder
·
Java/Spring
회사에서 Selenium Web UI Test를 담당하면서 테스트 격리를 위해 DB를 기존 초기 세팅된 상태로 초기화해야 하는 상황이 생겼습니다. 그래서 처음에는 RDB(MariaDB)와 NoSQL(Elasticsearch)을 세팅하는 docker-compose를 재실행하면 될 거라는 막연한 생각이었지만, 이는 시간이 많이 소모되기에 cmd창에서. sql 파일을 실행하는 방향으로 갔습니다. statement를 이용하여 sql을 실행하는 것도 가능하지만, DB 연결을 맺는 코드를 따로 작성해줘야 했기에 ProcessBuilder 클래스를 활용하게 되었습니다. ProcessBuilder 다른 외부 프로세스를 실행하거나 컨트롤러하는 것을 지원해 주는 Java class 윈도우의 cmd, 리눅스의 sh를 이용하..
[Java] ClassNotFoundException VS NoClassDefFoundError
·
Java
Java 예외 중에서, 런타임 시 클래스 파일을 사용할 수 없기 때문에 발생하는 에러인 ClassNotFoundException, NoClassDefFoundError에 대해 알아보도록 하겠습니다. 이 둘의 공통점은 모두 JVM이 클래스 경로에서 요청된 클래스를 찾을 수 없을 때 발생하는 에러인데요. 이 둘의 특징과 차이점에 대해서도 대해서도 설명드리겠습니다. 1. ClassNotFoundException 클래스 로더가 애플리케이션의 클래스 경로에 정의되어 있는 클래스를 찾지 못할 때 발생합니다. Class.forName(), ClassLoader.loadClass(), ClassLoaderFindSystemClass()를 사용하여 클래스를 로드하려고 할 때 주로 발생합니다. 리플렉션을 사용하는 동안 j..
[Java] HashMap, HashTable, ConcurrentHashMap 자료구조에 대해서 알아보자
·
Java/Java Concept
오늘은 Map Interface의 구현체의 일종인 HashMap, HashTable, ConcurrentHashMap 자료구조에 대해 알아보려고 합니다. 싱글 스레드 환경에서만 사용하는 HashMap에 대해 먼저 알아보겠습니다. 1. HashMap key, value에 null값 허용 동기화를 보장하지 않기에 싱글 스레드 환경에서만 사용 HashTable, ConcurrentHashMap보다 데이터 검색 속도를 빠르지만, 신뢰성과 안정성이 저하됩니다. 이제 해시맵에 데이터를 쓰는 과정에 대해 알아보겠습니다. 먼저, 배열 tab이 비어있거나 길이가 0이면 resize() 메서드를 통해 배열의 크기를 조정 배열의 특정 index에 node가 없으면, 새로운 node 생성하여를 해당 index에 할당 해당 i..
[Spring] Lightsail 배포 서버에서 Spring Application 실행 시, Encoding UTF-8 인식을 하지 못하고 한글이 깨지는 현상
·
Java/Spring
현재 진행하고 있는 캡스톤디자인2 프로젝트에서 하나의 issue가 발생했습니다. 해당 프로젝트에서 음식 정보와 알러지 유형을 allergy.properties 파일에 따로 담아두고, @PropertySource, @Value 어노테이션을 통해 음식 정보와 알러지 타입을 불러오도록 설정파일을 만들어 주었습니다. Application 실행 시, Local 환경에서는 인텔리제이 설정(File Encoding -> UTF-8)을 통해 한글이 깨지지 않고 해당 정보들이 잘 읽어왔습니다. 하지만, Lightsail 서버에서는 한글이 다 깨지는 현상이 발생하여 Application이 실행되지 않았습니다. 시도 1. Lightsail에도 UTF-8 설정 (해당 블로그 참조 : https://chucoding.tisto..
[Spring] @PropertySource, @Value 어노테이션에 대해 알아보자
·
Java/Spring
개발을 할 때, Property 파일을 resource 폴더 내에 만들어 두고 필요할 때 해당 값을 많이 읽어옵니다. 주로 데이터베이스 연결 설정이나 Property 파일의 속성을 주입할 때 사용합니다. 즉, @PropertySource 어노테이션을 통해 외부의 설정 파일(.properties, .yml)을 읽어와 해당 정보를 사용할 수 있게 됩니다. 이제 @PropertySource, @Value에 대해 간단하게 설명 드리도록 하겠습니다. @PropertySource("value = "classpath:allergy.properties") classpath:allergy.properties 경로에 있는 설정 파일을 읽어옵니다. Environment 객체를 이용해서 해당 설정 값을 가져올 수 있습니다. ..
[Spring] JPA Auditing 기술을 사용하여 생성일자, 수정일자 컬럼의 데이터 형식을 깔끔하게 지정하는법
·
Java/Spring
JPA Auditing 기술은 엔티티를 생성 및 변경할 때, 생성시간, 수정시간 등을 자동으로 삽입해 주는 기능입니다. Audit은 감사하다, 추적하다의 의미를 지니는데, Auditing 기술을 이용하면 마지막에 데이터를 생성 및 수정한 사람과 시간을 추적할 수 있게 됩니다. 우선, Auditing 기술을 사용하게 위해, SpringApplication.class에 다음과 같은 어노테이션을 지정해줘야 합니다. @EnableJpaAuditing public class ExerciseApplication { public static void main(String[] args) { SpringApplication.run(ExerciseApplication.class, args); } } 다음으로 생성시간, 수..
[Spring] DTO, VO 이 둘의 차이에 대해 알아보자
·
Java/Spring
저는 DTO랑 VO를 구분하지 않고 비슷한 맥락으로 보고 있었는데요. 이 들의 차이를 구분하고 어떤 상황에서 DTO를 도입하고, VO를 도입해야 하는지 하나씩 알아보도록 하겠습니다. DTO(Data Transfer Object) 순수하게 데이터를 담아 계층 간으로 전달하는 객체, Getter/Setter 메서드만을 가집니다. "데이터 전달"이 주목적입니다. 이를 통해 보내는 쪽에서 setter를 이용하여 값을 담아 전달하고, 받는 쪽에서는 getter를 이용하여 값을 꺼내서 쓰게 됩니다. setter의 경우, 변조 가능성이 있기 때문에(setter 사용 지양) 생성자로 값을 넣어주면, 전달하는 과정에서 변조가 불가능합니다. VO(Value Object) DTO(Data Transfer Object)와는 ..
[Spring] 웹 애플리케이션과 영속성 관리
·
Java/Spring
스프링 컨테이너의 기본 전략 스프링 컨테이너는 트랜잭션 범위의 영속성 컨텍스트 전략 사용 트랜잭션을 시작할 때 영속성 컨텍스트(Persistance Context)를 생성하고 트랜잭션이 끝나면 영속성 컨텍스트를 종료합니다. 핵심 비즈니스 로직을 담당하는 Service 클래스에서 @Transactional 어노테이션을 통해 트랜잭션을 시작하게 되고, 서비스보다 상위 계층에 있는 Layer는 준영속 상태가 됩니다. 준영속 상태가 뭔지 설명드리기 전에 엔티티 생명주기에 대해 간략하게 설명드리겠습니다. 엔티티 생명주기 비영속(new/transient): new 키워드로 객체를 생성만 한 상태 (영속성 컨텍스트에서 관리 X, 1차 캐시, 변경 감지 등의 기능 적용 X) 영속(managed): 영속성 컨텍스트에 의..