본문 바로가기
  • 주니어 개발자의
    RESTful 성장기

분류 전체보기89

Collections Framework (1) ArrayList, LinkedList ArrayList List 인터페이스를 구현하는 클래스이다. 따라서, 데이터의 저장 순서가 유지되고 데이터의 중복을 허용한다. public class ArrayList extends AbstractList implements List, RandomAccess, Cloneable, java.io.Serializable { ... transient Object[] elementData; ... }​ ArrayList는 Object[] 타입의 elementData 멤버변수를 가지고 있는데, 이 변수에 데이터가 저장된다. 또한, Object 배열로 모든 객체를 담을 수 있다. 데이터를 읽어오거나 저장하는 효율은 좋지만, 크기를 변경해야 하는 경우에는 새로운 배열을 생성하고 기존 배열에 저장된 내용을 복사해야하기.. 2022. 2. 8.
직렬화와 역직렬화 직렬화, 역직렬화 직렬화란, 객체를 데이터 스트림으로 만드는 것을 뜻한다. 이를 풀어서 말하면, 객체에 저장된 데이터(인스턴스 변수)를 연속적인 데이터로 변환하는 것을 말한다. 역직렬화란, 직렬화와 반대로 스트림으로부터 데이터를 읽어 객체를 만드는 것을 말한다. 직렬화, 역직렬화 방법 직렬화 - ObjectOutputStream 사용 역직렬화 - ObjectInputStream 사용 // 직렬화 FileOutputStream fos = new FileOutputStream("sample.txt"); ObjectOutputStream out = new ObjectOutputStream(fos); out.writeObject(new Sample()); // 역직렬화 FileInputStream fis = n.. 2022. 2. 7.
Reflection Reflection API란? 구체적인 클래스 타입을 알지 못하더라도 해당 클래스의 정보(타입, 필드, 메서드 등)에 접근할 수 있도록 해주는 Java에서 제공하는 API이다. 예시 public class Member { private String name; private void setName(String name) { this.name = name; } public String getName() { return name; } } 위와 같은 클래스가 존재할 때, 외부에서 Member class 필드인 name의 값을 직접 수정할 수 없다. 하지만 reflection API를 사용한다면, private 필드와 메서드를 이용할 수 있다. public class Main { public static void.. 2022. 1. 25.
Spring Boot에 Swagger2 적용하기 오늘의 Trouble Spring Boot 프로젝트에 Swagger2를 적용하는 과정에서 "Failed to start bean 'documentationPluginsBootstrapper'"라는 에러를 마주함. 원인은 무엇인가? Spring Boot의 버전이 2.6으로 올라가면서 spring.mvc.pathmatch.matching-strategy의 default 값이 기존 ant_path_matcher에서 path_pattern_parser로 변경되었다고 한다. @Configuration @EnableSwagger2 public class SwaggerConfig { @Bean public Docket restAPI() { return new Docket( DocumentationType.SWAGGE.. 2022. 1. 19.
SimpleJpaRepository.save() 에 대한 고찰 오늘의 Trouble Spring-data-jpa Repository 를 이용해 새로운 엔티티 등록 테스트를 진행하던 도중, SimpleJpaRepository.save()의 전달 엔티티와 반환 엔티티의 참조 값이 다른 현상을 마주하게 되었다. 원인 필자가 테스트하던 엔티티의 @Id는 @GeneratedValue가 아닌, String 값으로써 생성 시에 직접 입력을 해줘야 한다. 따라서, 새로 생성한 엔티티의 아이디 값이 null이거나 0의 값이 아니었다... @Repository @Transactional(readOnly = true) public class SimpleJpaRepository implements JpaRepositoryImplementation { private final JpaEnt.. 2022. 1. 17.
Abstract Factory Pattern 추상 팩토리 패턴 서로 관련 있는 여러 객체를 만들어주는 인터페이스를 제공한다. 구체적으로 어떤 클래스의 인스턴스를 사용하는 지 감출 수 있다. 다이어그램 출처: https://gmlwjd9405.github.io/images/design-pattern-abstract-factory/abstract-factory-pattern.png 팩토리 메서드 패턴과 추상 팩토리 패턴 팩토리 메서드 패턴 추상 팩토리 패턴 공통점 구체적인 객체 생성 과정을 추상화한 인터페이스를 제공한다. 특징 - 팩토리를 구현하는 방법에 초점을 둔다. - 구체적인 객체 생성 과정을 하위 또는 구체적인 클래스로 옮기는 것이 목적이다. - 팩토리를 사용하는 방법에 초점을 둔다. - 관련 있는 여러 객체를 구체적인 클래스에 의존하지 않고 .. 2022. 1. 17.
Factory Method Pattern Factory Method Pattern 객체를 생성하기 위한 인터페이스를 정의하고, 어떤 클래스를 생성할 지는 서브 클래스가 결정하도록 하는 디자인 패턴 출처: https://e7.pngegg.com/pngimages/649/269/png-clipart-factory-method-pattern-unified-modeling-language-class-diagram-factory-pattern-angle-white.png Factory Method Pattern의 장단점 1. 확장에 열려있고 변경에 닫혀있는 객체 지향 원칙을 적용해 인스턴스를 생성하는 로직을 수정하지 않고, 새로운 인스턴스를 다른 방법으로 생성할 수 있도록 확장할 수 있다. 2. 인스턴스(Product), 팩토리(Creator) 간의 결.. 2022. 1. 15.
Process, Thread Process vs Thread 1. Process - 프로그램이 실행된 상태를 말한다. - 프로그램을 실행하기 위해서는 필요한 메모리를 할당 받는다. (Code, Data, Heap, Stack) - 각각의 프로세스는 자원을 공유하지 않는다. - 자원을 공유하지 않기 때문에 Context Switching 비용이 크다 - ex) 햄버거를 만드는 프로그램인 경우, 햄버거를 만들기 위해 필요한 재료를 만드는 일을 모두 수행하는 것. 2. Thread - 하나의 프로세스 내에서 나뉘어진 하나 이상의 실행 단위를 말한다. - 부모 프로세스의 자원을 공유한다. (Code, Data, Heap) - 자원을 공유하기 때문에 Context Switching이 발생할 때 캐시 적중률이 올라가고, 비용이 작다. - ex.. 2022. 1. 14.
Singleton Pattern Singleton Pattern 인스턴스를 단 한 개만 제공하는 클래스 구현 방법 1. private 생성자와 static 메소드를 이용한 구현 public class Singleton { // 클래스 당 하나만 존재해야하기 때문에 static 필드를 가지도록 한다. private static Singleton instance; // 생성자의 접근 지정자를 private으로 지정함으로써, new를 이용한 생성을 막는다. private Singleton() {} // 생성자를 사용할 수 없으니, 외부에서 인스턴스를 얻기 위해 static으로 지정한다. public static Singleton getInstance() { if (instance == null) { instance = new Singleto.. 2022. 1. 13.