[ 백엔드 개발 ](36)
-
[JAVA] 인터페이스의 발전 과정
디폴트 메소드 도입 자바 8부터 인터페이스의 기능이 개선되었다. 그중 하나가 인터페이스가 구현체를 가지게 된 것인데 이것이 인터페이스의 디폴트 메소드이다. 인터페이스는 모든 메소드가 추상 메소드로만 이루어진 클래스를 의미한다. 하지만 자바 8부터 디폴트메소드가 인터페이스에 들어갈 수 있게 되면서 추상 클래스와의 차이가 거의 없어졌다. 예시 default void say() { // 디폴트 메소드의 구현 몸체부 // 디폴트 메소드의 구현 몸체는 이를 구현하는 클래스가 아닌, // 인터페이스가 자체적으로 가지고 있음 } 디폴트 메소드를 사용하는 이유 - 어뎁터의 기능 사용 - 디폴트 메소드 등장으로 인해 static 메소드도 가질 수 있게 됨. - default, static 메소드들은 implements를..
2022.04.16 -
[java] Collection 인스턴스 동기화
Collection 인스턴스 동기화 - 2개 이상의 쓰레드가 컬렉션에 동시에 접근한다는 가정이 필요할 땐 동기화를 해주어야 한다. - 일반적인 대부분의 컬렉션들(ArrayList, HashMap 등)은 동기화가 되어있지 않다. 컬렉션 동기화 메소드 1) public static Set synchronizedSet(Set s) 2) public static List synchronizedList(List list) 3) public static Map synchronizedMap(Map m) 4) public static Collection synchronizedCollection(Collection c) - 위 메소드에서 동기화가 되어 있지 않은 컬렉션을 인자로 주면 동기화 기능이 추가된 컬렉션으로 반환..
2022.04.07 -
[test] Controller 테스트와 MockMvc
모델 단을 단위 테스트하는 것과 비슷하게, 컨트롤러도 Mockito와 Junit을 이용해 단위 테스트할 수 있다. 하지만 이 경우 실질적인 HTTP 제이슨 페이로드를 받아 검증하는 방식은 아니다. @Vaild와 같은 어노테이션을 포함한 다양한 것들을 검증하기 위해서는 Mockito와 Junit 만으로는 부족하다. 이러한 경우를 대비해 스프링이 MockMvc를 제공하고 이를 활용해 컨트롤러 end point를 적용한 테스트를 진행할 수 있다. 즉, MockMvc를 활용하면 모의 서블릿 환경에 대한 테스트를 작성할 수 있다. 또한 Mockito에서 제공하는 @Mock이나 @InjectMocks와 같은 어노테이션은 스프링 컨텍스트에 로드하지 않기 때문에 컨트롤러 테스트에서는 사용될 수 없다. 이때는 @Mock..
2022.04.07 -
[java] 쓰레드, 동기화, 풀, Runnable, Callable, Future
쓰레드 생성 과정 1. Runnable 인터페이스를 구현한 인스턴스 생성 2. Thread 인스턴스 생성 3. start 메소드 호출 예제코드1 class Solution { final static ThreadLocal threadLocal = new ThreadLocal(); public static void main(String[] args) { Runnable task = () -> { threadLocal.set(1); int num1 = 10; int num2 = 20; String ctName = Thread.currentThread().getName(); System.out.println(MessageFormat.format("num1 + num2 = {0} from {1} and threa..
2022.04.06 -
<추천글>[JAVA] Tim Sort 알고리즘 / 지역성의 원리
정렬 알고리즘에서 시간복잡도의 핵심 - 정렬 알고리즘의 평균적인 시간복잡도는 C * nlg(n) + A이지만 (C는 상수) 여기서 C값을 결정하는 요인은 '지역성의 원리'이다. - 지역성의 원리란 '최근에 참조된' 또는 '참조된 데이터의 주변의 데이터'가 또다시 참조될 가능성을 의미한다. - 따라서 이를 활용하면 캐시 hit 발생률이 높아지고 메모리까지 가지 않아도 빠르게 데이터를 읽어올 수 있다. - 예를 들어, merge sort의 경우에는 인접한 데이터들끼리 쪼개서 정렬 후 병합하기 때문에 지역성의 원리가 잘 활용된다고 볼 수 있다. - 퀵 소트의 경우 pivot 주변에서 데이터의 이동이 빈번하게 발생하기 때문에 작은 C값을 가진다. (퀵 소트는 추가적인 메모리 사용 없이도 정렬한다는 점에서 '평균..
2022.01.25 -
[java] HashMap 동작 과정, String의 해쉬 값
HashMap - HashTable과 다르게 쓰레드 동기화를 하지 않음(single-thread에서 유용) - 기본적으로 해쉬값을 반환하는 해쉬함스로써 hashCode()를 사용함 - hashCode()의 반환형은 int임 - int는 32비트(4Byte)이고 2^32개로 완벽한 해쉬값을 만들 수 없음(표현해야 할 key가 2^32개 보다 많을 경우) - HashMap은 O(1)을 보장하기 위해 random access가 가능하게 하려면 HashMap의 크기는 2^32개 여야 함 - 그래서 보통 2^32보다 작은 숫자 M을 이용해 해쉬값을 다음과 같이 다시 정의함 (int index = X.hashCode() % M) - 여기서 M은 2의 지수승 형태임. 즉, M이 2^a 형태라면 hashCode()의 ..
2022.01.11 -
<추천글>[JPA] CascadeType.REMOVE vs orphanRemoval true
영속성 전이와 고아 객체는 다른 개념이다. CascadeType과 orphanRemoval은 각각 영속성 전이와 고아 객체 개념에 해당한다. 1. CascadeType.REMOVE - 부모 엔티티가 삭제될 때, 자식 엔티티도 함께 삭제되도록 한다. - 부모 엔티티에 설정한다. 따라서 양방향 연관관계일 경우에만 해당한다. - 부모를 삭제하는 것이 아닌 단순히 부모와 자식의 연관관계를 제거하는 연산에 대해서는 자식 엔티티를 삭제하지 않는다. 예를 들어 부모 엔티티에서 one-to-many로 Collection 형태의 자식 엔티티들을 가지고 있을 때, 해당 Collection에서 특정 자식 엔티티를 삭제하는 연산에 대해서는 delete 쿼리가 발생하지 않는다. 부모 엔티티가 삭제된 것이 아니기 때문이다. cf..
2022.01.10 -
<추천글>[JPA] 연관관계 핵심 정리 (JPA의 근본적인 문제)
양방향 연관관계 - 일반적으로 RDB는 방향이 존재하지 않음. 즉, 양방향이라는 개념 자체가 없음 - OneToMany를 사용하더라도 실질적으로 One 쪽의 DB에 컬럼이 생기지 않음 - 객체 단에서 편리함을 제공하기 위해 양방향 연관관계를 제공하는 것 - 따라서 JPA에서 양방향 연관관계를 사용할 경우 연관관계 주인을 정의해 줘야 함 - 연관관계의 주인인 Entity만 외래키의 값을 변경할 수 있고 상대방 Entity는 조회만 가능한 제약이 있음 - 양방향 연관관계를 설정하면 양쪽 모두에 참조 변수를 설정해 줘야 함(동기화 필요). - 이러한 불편함을 해결하고자 연관관계 편의메소드를 활용 - 일반적으로 연관관계 편의 메소드는 주인 엔티티에 정의함(주인이 아닌 쪽에 정의해도 됨) - 추후 유지보수나 확장..
2022.01.04 -
[JPA] Entity와 기본생성자, Proxy
Entity가 기본생성자를 필요로 하는 이유 - JPA는 DB 값을 자바 객체로 직렬화할 때 Reflection을 이용함 - Reflection이란 구체적인 클래스 타입을 알지 못해도 그 클래스의 메소드, 타입, 변수들에 접근할 수 있도록 해주는 Java API - JPA에서는 자바 객체로 직렬화할 때 기본생성자를 통해 먼저 객체를 만들고나서, Reflection을 통해 필드 값을 주입함 - 따라서 Entity에는 기본생성자가 필요하고 기본생성자가 없다면 예외가 발생함(InstantiationException) Proxy - '상속'을 이용해 특정 객체를 한 번 감싸 이전, 이후에 특정 로직을 추가하도록 하는 개념 - JPA의 fetch 타입을 LAZY(지연로딩)으로 할 경우, Proxy로 해당 객체를 ..
2022.01.04 -
[java] Thread Synchronization (Monitor)
Race Condition - 멀티 쓰레드 환경에서 발생할 수 있는 상황 - shared resource에 대해서 2개 이상의 task들이 동시에(concurrent, parrallel 모두 해당) 접근을 시도할 경우 이들 간의 순서로 인해 결과 값에 영향을 줄 수 있는 상태를 의미 - 이로 인해 shared resource에 대한 연산에 대해서 일관성이 깨진 상태의 결괏값이 도출될 수 있음 The degree of multiprogramming : single-processor가 수용할 수 있는 최대 thread 개수 Mutual exclusion - Race Condition을 해결하기 위한 개념 - 한 시점에 하나의 task만이 shared resource에 접근할 수 있음 (상호 배제) - 단, ..
2021.12.28