전체 글 348

프로토타입 패턴

프로토파입 패턴 기존 인스턴스를 복제하여 새로운 인스턴스를 만드는 방법 복제 기능을 갖추고 있는 기존 인스턴스를 프로토타입으로 사용해 새 인스턴스를 만들 수 있다. 시간이 오래 걸리는 작업(예를 들어 DB에서 데이터를 읽어와서 이걸 토대로 인스턴스를 만들어야 하는 경우, http를 통해 얻은 데이터를 통해 인스턴스를 만드는 경우 등..) 을 할 때에 매번 이를 만드는 것은 리소스와 시간 낭비가 크다. 그렇기 때문에 이렇게 만들어 둔 데이터를 복제해서 새로운 인스턴스를 만들고, 이곳에서 얻어온 정보를 토대로 변경 작업 등을 해주면 더 효율적이게 될 것이다. issue 상황 public class GithubIssue { private int id; private String title; private Gi..

이론 정리/java 2023.01.25

빌더 패턴

빌더 패턴 어떤 인스턴스를 만들 때 다양한 구성으로 만들어 질 수 있는데, 인스턴스를 동일한 프로세스를 통해 만들 수 있게끔 해주는 것이다. 문제 상황 public class TourPlan { private String title; private int nights; private int days; private LocalDate startDate; private String whereToStay; private List plans; public TourPlan() { } public TourPlan(String title, int nights, int days, LocalDate startDate, String whereToStay, List plans) { this.title = title; thi..

이론 정리/java 2023.01.25

final

final 이거 은근 많이 쓰이는데 생각보다 아무생각 없이 쓰게된다. 일단 final은 클래스, 메소드, 멤버변수, 지역변수에 사용될 수 있는데 이걸 쓰면 class 변경, 확장될 수 없는 클래스가 된다. 다른 클래스의 조상이 될 수 없다! method 변경될 수 없는 메소드가 된다. 오버라이딩을 통한 재정의가 불가능하다. 멤버/지역변수 값을 변경할 수 없는 상수가 된다. 단 한번의 초기화만 가능하다!! public final class Test { // 조상이 될 수 없는 클래스 final int max_size = 100; // 값을 변경할 수 없는 멤버 변수 (상수) final void getMaxSize() { // 오버라이딩 할 수 없는 메소드 final int localValue = max_s..

이론 정리/java 2023.01.24

직렬화(Serializable)

직렬화(Serializable) public interface Serializable{ } 직렬화용 Serializable 인터페이스 내부를 보면 메소드가 하나도 구현이 안되어있다. 그럼 얘가 뭔 용도가 있을까?? 생성한 객체를 파일로 저장할 때 저장한 객체를 읽을 때 다른 서버에서 저장한 객체를 받아서 사용할 때 이런 식으로, 생성한 클래스를 파일에 읽거나 쓸 수 있도록 하거나 혹은 다른 서버로 보내거나 받을 수 있도록 하기 위해서는 Serializable 인터페이스를 반드시 필요로 한다. 즉 Seriablizable 인터페이스를 통해 JVM은 특정 객체를 저장하고, 읽거나, 다른 서버와 주고받을 수 있게 된다. 이게 뭐길래?? 직렬화 java내부의 객체나 데이터를 외부의 자바 시스템에서 사용할 수 있..

이론 정리/java 2023.01.24

java 초기화

Initialization 변수의 초기화 변수를 처음 선언하고 초기화 하는 것이다. 선언하자마자 자신이 사용하고 싶은 값으로 초기화 해주는것이 좋다. 명시적 초기화(explicit initialization) 변수를 선언함과 동시에 초기화 말 그대로 변수를 선언함과 동시에 초기화한다. 초기화 블럭(initialization block) 명시적 초기화에 비해 복잡한 초기화 작업이 필요할 때에 사용한다. 두 가지 종류가 있는데 클래스 초기화블럭 클래스변수의 초기화에 사용 클래스가 메모리에 처음 로딩될 떄에 한 번 수행 인스턴스 초기화블럭 인스턴스 초기화에 사용 생성자와 같이 인스턴스를 생성할 때 마다 수행 인스턴스 초기화 블럭이 생성자 초기화 블럭보다 먼저 수행된다. 그래서 초기화 블럭이 뭔데? public..

이론 정리/java 2023.01.22

Optional이란??

Optional이란?? Spring Data JPA를 이용해서 개발을 할 때에, find메서드를 사용하면 Optional이 기본적으로 나올 것이다. Optional이 일단 무엇일까?? T타입의 객체를 감싸는 generic 형태의 Wrapper클래스 Optional은 모든 타입의 참조 변수를 담을 수 있다. public final class Optional { private final T value; // T타입의 참조변수 }이런 식으로, 참조 변수들을 그냥 반환하는 것이 아니라, Optional로 한번 감싸서 보내주는 것이다. 이걸 왜 해줄까?? 만약 바로 객체를 보내준다 가정하면 없는 객체를 가져와서 확인하려 하면? 객체 가져옴 객체가 없음 사용하려 한다 에러!! 이렇게 된다. 따라서 보통 객체를 바로..

이론 정리/java 2023.01.19

save랑 saveAll(feat. Transactional)

save랑 saveAll(feat. Transactional) Spring Data JPA를 통해 다양한 쿼링을 쉽게 해줄 수 있다. 근데 만약에 여러 insert를 해줘야 하는 경우가 있다면 어쩔까?? 상황 일단 Spring Data JPA에 대해 안다고 가정한다. 여러 값을 저장할 때에 save방식 넣을값들.forEach( index -> 저장레포지터리.save(index) )이거랑 saveAll방식 저장레포지터리.saveAll(넣을값들);의 차이가 뭘까?? save 일단 save를 한번 본다. saveAll 이제 saveAll을 본다 뭐가 다른겨? 사실 saveAll을 보면 최초에 Transactional 어노테이션 실행 해당 함수 내에서 save함수 실행 저 save는 save함수임 이렇게 간다...

spring boot No serializer found for class 오류

No serializer found for class 오류 프로젝트를 하던 중에 만난 문제인데, 쓸데없이 시간을 자꾸 낭비하게 되어 기록하게 되었다. A의 값을 가져올 때에 A_DTO, B_DTO 이런 식으로 여러 DTO들을 통해 값을 가져오는데 자꾸 No serializer found 에러가 났다. 아니 근데 DTO를 써주고 있는데 직렬화 문제가 왜 나는거지...? 싶었는데 1시간동안 삽질하다가 간단한 문제를 발견했다. 이런 느낌으로 에러가 있을 때에 결국 실제 문제는 tagMemeDetailResponses쪽에서 난건데...? 하고 보았는데 @Getter가 설정이 안돼있었다 그러니까 DTO를 쓸때에 혹시라고 seriablizer 에러가 나면 사용하는 모든 DTO를 확인하면서 @Getter 어노테이션이..

캐시 전략

Redis의 캐싱 전략 개발을 할 때에 Redis를 통해서 값을 캐싱시켜 둔다면, 더 빠르게 값들을 처리할 수 있다. 이 이유를 간단하게 말하자면 DB를 통해 값을 가져오는 것 보다 캐시에 있는 데이터를 사용하면 성능면에서 더 빠르기 때문이다. 그렇기 때문에 cache miss(캐시된 데이터가 없어서 DB를 통해 해당 값을 가져온다.)를 적게 하고 cache hit(캐시된 데이터에서 바로 값을 가져옴)를 최대한으로 해야 한다. 또한 캐시는 RAM데이터를 사용하는데, 이게 데이터가 크지 않기 때문에 이를 잘 관리해야 한다. 즉 최대한 DB서버를 통하지 않고 Redis를 통해 값을 받을 수 있도록 하기 Redis의 크기를 효율적으로 관리하기 를 해내야 할 것이다. 이를 위한 전략들을 살펴보도록 한다. 읽기 ..

Stream의 연산

스트림의 연산 스트림은 중간 연산과 최종 연산을 제공한다. 중간연산 연산결과가 Stream 여러 번 적용 가능 최종연산 연산결과가 Stream이 아니다. 단 한번만 적용 가능(Stream요소를 소모함) 중간 연산 스트림 자르기 - skip(), limit() Stream skip(long n) // 앞에서부터 n개 건너뛰기 -> n+1 ~ 끝까지 Stream limit(long maxSize) // maxSize이후는 잘라냄 -> 0 ~ maxSize까지예를 들어 IntStream intStream = IntStream.rangeClosed(1, 10); // 1 2 3 4 5 6 7 8 9 10 intStream.skip(3).limit(5).forEach(System.out::print); // 4 ..

이론 정리/java 2023.01.14