리플렉션으로 DI 컨테이너 만들기
2021. 12. 21. 19:40
Java
java 리플렉션 리플렉션이란? 클래스 타입을 알지 못해도, 해당 클래스의 필드, 메서드 등 클래스의 메타 정보에 접근할 수 있도록 도와주는 자바 API이다. 즉, 리플렉션은 클래스나 메서드의 메타정보를 사용해서 동적으로 호출하는 메서드를 변경할 수 있다. 구체적인 클래스 타입을 알지 못한다? 이 의미는 스프링의 DI 컨테이너에서 @Service, @Repository를 생각하면 된다. 해당 애노테이션을 붙이면 new를 해주지 않아도 알아서 주입이 된다. 이걸 가능하게 하는 것이 리플렉션이다. 그럼 클래스 타입을 알지 못한다는 것은 무슨 상관일까? 이 부분은 해당 글이 마지막 DI 프레임워크 만들기에서 더상세하게 설명 하겠지만, 간략히 설명 하겠다. 코드로 예를 들어보자. 아래는 두 개의 클래스가 있다...
JPA 영속성 컨텍스트가 뭘까?
2021. 10. 18. 00:01
JPA
JPA 영속성 컨텍스트에 관하여 클라이언트 요청부터 DB까지 동작하는 로직 웹 애플리케이션에 클라이언트 요청이 들어오면 EntityMangagerFactory 는 EntityManager 객체를 생성하게 됩니다. 각각 생성된 EntityManger 객체는 DB 커넥션 풀과 연결되게 됩니다. 영속성 컨텍스트 엔티티를 영구 저장하는 환경입니다. DB에 저장하는 것이 아니라 영속성 컨텍스트 에 저장하는 것입니다. EntityManager.persist(entity); 와 같이 엔티티를 EntityManager에 저장하여 사용할 수 있다는 것입니다. 즉, 'EntityManager' 를 통해 영속성 컨텍스트 에 접근하는 것입니다. 더 쉽게 이해하려면 EntityManager -> Persisten..
인터페이스로 객체지향스럽게 다형성을 이용하여 중복 제거 하기
2021. 10. 14. 01:18
Java
인터페이스를 활용하여 중복된 소스 제거하기 우리는 평소 중복 코드를 많이 작성하고 있다. 이는 기본적으로 인터페이스의 활용할 줄 모르는 이유도 있습니다. 중복 코드를 제거하는 방법 중 한 가지가 인터페이스의 활용인데 그 방법을 설명하겠습니다. 인터페이스를 사용한다는 것은 변화되는 부분을 인터페이스로 추출한다는 의미입니다. 인터페이스로 추출해서 인터페이스로 파라미터를 받게 되면 구현체만 변경되면 중복을 제거할 수 있습니다. 즉, 클라이언트 코드는 구현체만 갈아 끼워주면 되는 것입니다. 핵심 로직은 클라이언트 코드가 알 필요가 없습니다. 즉, 인터페이스는 역할만 제공한다. 역할에 대한 책임은 구현체가 담당하는 것입니다. 인터페이스를 활용하여 다형성을 활용하게 됩니다. 인터페이스 활용 전 아래와 같이 모두 더..
JVM 동작 원리
2021. 10. 11. 14:49
Java
JVM이란 무엇인가? JVM(Java Virture Machine) 자바 가상 머신으로 자바 바이트 코드(.class 파일)를 실행할 수 있는 공간이다. 가상 머신이므로 어떤 OS에서도 독립적으로 실행이 가능하다. 핵심은 JVM은 OS 위에서 동작하게 되며, 자바 코드를 컴파일한 바이트 코드를 운영 체제가 이해할 수 있는 기계어로 변환하여 코드를 실행 시킨다. JVM 구성요소 1. ClassLoader 바이트 코드를 JVM이 운영 체제로 부터 할당받은 메모리 영역인 Runtime Data Area로 적재하는 역할 메모리를 할당 받았기 때문에 당연히 애플리케이션을 실행하면 수행된다. .java 파일을 javac.exe가 컴파일한 .class(바이트 코드)가 적재된다. 적재되는 시점은 Runtime시 적재된..
Arrays의 asList가 뭐고 왜 써야 할까?
2021. 10. 8. 01:15
Java
Arrays의 asList java8 API 문서에 보면 아래와 같이 나와 있습니다. 고정된 배열을 반환한다. 읽기 전용 배열을 반환한다 그래서 어떻게 사용하는 걸까? 아래와 같이 두 가지 방법으로 사용이 가능 합니다. 어떤 특징이 있을까? add, remove가 불가능하다(읽기 전용). AstractList 라는 추상 클래스의 add, remove를 상속받아 사용합니다. 아래 소스를 보면 불가능한 이유를 알 수 있습니다. UnsupportedOperationException 를 예외로 던지기 때문 입니다. 변경은 가능하다. AbstractList 에서 set 메서드는 add, remove와 동일한 예외를 발생 시키지만, AbstractList 를 상속받아 set 메서드를 오버라이드 하기 때문에 변경이 ..
hashCode와 toString
2021. 10. 5. 22:19
Java
hashCode() 객체의 해시코드를 반환하는 메서드 Object 클래스의 hashCode()는 객체의 주소를 이용해 int로 변환해서 반환 두 객체가 같은 객체인지 확인하기 위해 사용. Object 클래스에서 어떻게 구현 되어 있을까? native 메서드는 OS의 메서드이고, C언어로 작성되어 있음. body가 없는데 이는 이미 OS에서 작성된 기능이기 때문에 직접 만질 일이 없기 때문 입니다. 그래서 변경하기 위해 @Override를 해야 합니다. hashCode() 메서드 overriding 규칙 equals()를 overried하면, hashCode()도 overriding 해야 합니다. 왜냐하면, equals()의 결과가 true인 두 객체의 hashCode는 같아야 하기 때문 입니다..* 원래..
org.springframework.dao.InvalidDataAccessApiUsageException: No enum constant
2021. 10. 3. 14:46
Spring
org.springframework.dao.InvalidDataAccessApiUsageException: No enum constant 이번에 devlogmoa를 운영 중 위와 같은 에러가 발생 했습니다. 왜 발생 했을까? 메시지에 No enum constant에 나와 있듯 enum 상수가 없다는 의미입니다. 그런데 저는 분명 있었습니다. 코드는 위와 같습니다. 분명히 enum이 존재 했습니다. 하지만 저는 리팩토링을 하면서, enum의 Y -> USE, N -> UNSED로 변경 했습니다. 그래서 DB에 Member의 해당 컬럼이 Y, N으로 되어 있어서 위와 같은 에러가 발생했던 것입니다. 이 부분은 완전 처음 겪어보는 상황이었습니다. 휴~ 해결 방법 DB update!!!
Java로 자료구조 이해하기 3편(Stack과 Queue)
2021. 10. 2. 16:28
Java
Stack과 Queue란? Stack(Class) LIFO(Last In First Out) 구조 마지막에 저장한 것을 제일 먼저 꺼낸다. Array 기반 Queue(Interface) FIFO(First In First Out) 구조 제일 먼저 저장한 것을 제일 먼저 꺼낸다. LinkedList 기반 -> Interface이기 때문에 LinkedList가 Queue를 구현 이게 끝 입니다. 왜 그런지 알아 보도록 하겠습니다. Stack은 밑이 막혀있고 위만 뚫려 있는 구조 입니다. 우리가 일반적으로 알고 있는 상자와 같습니다. 책을 넣으면 마지막에 넣은 책 부터 뺄 수가 있죠? 정확히 그와 같은 구조 입니다. 그렇기 때문에 마지막에 저장한 것을 제일 먼저 꺼낸다 는 특징이 있습니다. 반대로 Queue ..