전체 글48 1장. 사용자 수에 따른 규모 확장성 수직적 규모 확장 vs 수평적 규모 확장수직적 규모 확장서버에 고사양 자원(CPU, RAM)을 추가하는 행위이다.확장에 한계가 있다.장애에 대한 자동복구 방안이나 다중화 방안을 제시하지 않는다.수평적 규모 확장더 많은 서버를 추가하여 성능을 개선하는 행위이다.로드밸런서클라이언트로부터 들어오는 요청을 여러 웹 서버로 분산하여 부하를 줄이고 가용성을 높이는 역할을 수행한다.로드밸런서의 공개 IP 주소를 통해 클라이언트와 통신을 하고, 서버 간 통신은 사설 IP주소를 사용한다.데이터베이스 다중화서버 사이에 주(master)-부(slave) 관계를 설정하고 데이터 원본은 주 서버에, 사본은 부 서버에 저장하는 방식이다.쓰기 연산은 마스터에만하고, 부 데이터베이스는 주 데이터베이스로부터 사본을 전달받아 읽기 연산.. 2025. 1. 12. [아이템 50] 적시에 방어적 복사본을 만들라 클라이언트가 우리의 불변식을 깨뜨리려 혈안이 되어 있다고 가정하고 방어적으로 프로그래밍을 해야 한다. Period.class final class Period { private final Date start; private final Date end; public Period(Date start, Date end) { if (start.compareTo(end) > 0) throw new IllegalArgumentException("start가 end보다 늦다."); this.start = start; this.end = end; } public Date getStart() { return start; } public Date getEnd() { return end; } } start와 end가 한번 .. 2022. 2. 15. [아이템 49] 매개변수가 유효한지 검사하라 메서드와 생성자의 입력 매개변수의 값에 제약조건이 있다면 필수적으로 해야 할 것. 메서드에 대한 문서화. 메서드 몸체가 시작되기 전에 매개변수 유효성 검사. 메서드 몸체가 실행되기 전에 매개변수를 확인한다면 잘못된 값이 넘어왔을 때 즉각적이고 깔끔한 방식으로 예외를 던질 수 있다. 검사를 제대로 하지 못하면 잘못된 반환 값을 던지거나, 메서드와 관련 없는 예외를 던질 수 있으니 주의해야 한다. 아래 코드는 문서화와 유효성 검사의 전형적인 예이다. 자바 7엔 Objects.requireNonNull 메서드가 추가되어 간편하게 null 검사가 가능하다. public static T requireNonNull(T obj) { if (obj == null) throw new NullPointerException.. 2022. 2. 14. Spring Data Jpa의 N+1 문제 N+1 문제란 DB에서 데이터를 조회할 때 연관된 데이터를 추가로 쿼리문을 실행해 조회하는 현상을 뜻한다. 쿼리문이 추가로 실행되는게 무슨 대수냐 할 수 있지만 대부분의 DB는 Disk I/O와 Network I/O가 발생함으로 불필요한 쿼리가 실행되지 않게 해야 성능의 부담을 줄 수 있다. JPA에서 N+1 문제가 언제 발생하는지 알아보고 해결해 보겠다. 예를 위한 Person, Team 그리고 각각 Repository를 만들어 봤다. Person.class @Entity @Data @AllArgsConstructor @NoArgsConstructor @Builder public class Person { @Id @GeneratedValue private Long id; private String na.. 2022. 2. 7. [아이템 26] 로 타입(raw type)은 사용하지 말라 아이템 26부터 제네릭에 대한 내용이다. 로 타입이란 타입 매개변수가 없는 제네릭 타입으로 List를 예로 들 수 있다. List rawList = new ArrayList(); // 로 타입 리스트 List strings = new ArrayList(); // 문자열을 담는 리스트 List integers = new ArrayList(); // 정수를 담는 리스트 rawList.add(1); rawList.add(1.1); rawList.add("raw"); rawList.add('r'); strings.add(1); // 컴파일 에러 로 타입은 Object를 넣을 수 있어 어떤 객체도 담을 수 있다. 그래서 문제가 되는데 예상치 못하게 넣지 말아야 할 객체를 넣었다면 형 변환 런타임 오류가 발생할 수.. 2022. 2. 7. Java의 == 와 equals() Java에서 값을 비교하는 방법은 == 연산자와 equals() 메서드를 사용하는 것이다. == 연산자는 순수하게 값을 비교해주는 연산자이며, equals()는 논리적으로 같은 객체인지 비교하는 메서드이다. 예를 설명하기 위해 Person 클래스를 만들어보았다. name이 다르더라도 id 값이 같다면 동일 인물이다. class Person { Long id; // 주민등록번호 String name; // 이름 public Person(Long id, String name) { this.id = id; this.name = name; } } 일단 == 비교 연산을 해보았다. public static void main(String[] args) { Person p1 = new Person(1L, "홍길동").. 2022. 1. 14. 이전 1 2 3 4 5 ··· 8 다음 728x90