getOrDefault key 가 null 일 경우 default Value 를 설정할 수 있다. /* Map */ Map testMap2 = Map.ofEntries(entry("AAA", 10), entry("BBB", 20), entry("CCC", 30)); Key가 존재하면 해당 Value 를 그대로 출력한다. System.out.println(testMap2.getOrDefault("AAA", "NULL")); // 10 Key가 존재하지 않으면 설정된 "NULL"을 출력한다. System.out.println(testMap2.getOrDefault("DDD", "NULL")); // NULL 계산패턴 computeIfAbsent key 가 없을 경우 지정된 value를 쌍으로 Map 에 항목..
forEach /* Map */ Map testMap2 = Map.ofEntries(entry("AAA", 10), entry("BBB", 20), entry("CCC", 30)); 전체 요소를 출력해보자. 기존 for문 for (Map.Entry entry : testMap2.entrySet()) { System.out.println(entry.getKey()); } java8 forEach testMap2.forEach((name, num) -> System.out.println(name + " : " + num)); sorted /* Map */ Map testMap2 = Map.ofEntries(entry("AAA", 10), entry("BBB", 20), entry("CCC", 30)); ke..
List.of 오버로드 List 인터페이스의 of 메소드를 보면 아래와 같이 다양한 오버로드 버전이 있다. static List of() { return ImmutableCollections.emptyList(); } static List of(E e1) { return new ImmutableCollections.List12(e1); } static List of(E e1, E e2) { return new ImmutableCollections.List12(e1, e2); } static List of(E e1, E e2, E e3) { return new ImmutableCollections.ListN(e1, e2, e3); } ... static List of(E e1, E e2, E e3, E e..
List 1) Arrays.asList : 요소 갱신은 가능하나, 추가/삭제할 수 없다. /* List */ List testList = Arrays.asList("AAA", "BBB", "CCC"); testList.set(0, "DDD"); // 갱신은 가능하다. // testList.add("DDD"); // 고정 리스트로, 요소를 추가/삭제 할 수 없다. 2) HashSet(Arrays.asList()) // 리스트를 인수로 받는 HashSet 생성자를 사용하여 생성할 수 있다. Set testSetList = new HashSet(Arrays.asList("AAA", "BBB", "CCC")); testSetList.add("DDD"); 3) List.of 팩토리 메소드 : 리스트를 변경할 수 ..
영속성 컨텍스트 JPA에서 영속성 컨텍스트란, 엔터티를 영구 저장하는 환경을 말한다. 영속성 컨텍스트는 우리가 개발하면서 직접 관리할 수 없다. 영속석 컨텍스트는 논리적인 개념이고 눈에 보이지 않는다. 엔터티 매니저를 통해서 영속성 컨텍스트에 접근이 가능하다. EntityManager.persist(entity); 영속성 컨텍스트 엔티티의 생명주기 1) 비영속 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태 2) 영속 영속성 컨텍스트에 관리되는 상태 3) 준영속 영속성 컨텍스트에 저장되었다가 분리된 상태 4) 삭제 영속성 컨텍스트에서 삭제된 상태 생명주기 관리 비영속 상태 Member member = new Member(); Member.setId(“aa”); 영속 상태 Member member = ne..
SQL 중심의 개발 SQL 중심의 개발에서는 개발자가 직접 SQL 매핑을 한다. 각 테이블의 관계성을 생각하여 쿼리를 짜고, 비즈니스 로직을 수행하기 위해 단계별로 쿼리를 실행시킨다. 부모 테이블 -> 자식 테이블 까지의 데이터 등록이 필요하다면 INSERT 쿼리를 여러개 수행하게 되고, 각 테이블의 연관관계 (PK, FK) 의 조인도 개발자가 직접 설계한다. 객체지향적으로 설계할수록, SQL 작업은 더 복잡해지고 힘들어진다. 매핑 작업이 늘어나게되고, 개발자가 직접 해야하는 일들이 늘어나기 때문에 그에 따른 책임감이 더욱 발생하게된다. JPA 만약, 객체를 자바 컬렉션(Map, List) 에 저장하듯이, DB에 저장할 수는 없을까? 이러한 생각을 바탕으로 나온 것이 바로 JPA이다. ORM JPA를 알..
샘플 리스트 // sample List List products = Arrays.asList( new Product(0, "Note_red", 1, 100), new Product(1, "Note_blue", 2, 200), new Product(2, "Note_green", 3, 300), new Product(3, "Note_pink", 4, 400), new Product(4, "Note_yellow", 5, 500), new Product(5, "Note_black", 6, 600), new Product(6, "Note_white", 7, 700), new Product(7, "Note_purple", 8, 800) ); 요약 Collectors.coutning() /* Collectors 의 ..
평면화 FlatMap List의 요소에 속하는 모든 고유문자를 리스트로 리턴받고 싶다. 아래의 과정을 걸쳐서 스트림 평면화를 진행하는 flatMap을 이해해보자. 우선, 우리가 하고싶은 상황은 아래와 같다. 이전: "AAA", "BBB", "CCC" 이후: "A", "A", "A", "B", "B", "B", "C", "C", "C" 과정1. Map 사용 // sample List List wordList = Arrays.asList( "AAA", "BBB", "CCC" ); /* 원하는 결과 : List / 결과 : List */ List productNameList = wordList.stream() .map(word -> word.split("")) .collect(Collectors.toList(..
샘플 파일 생성 1) Product.java public class Product { private int idx; private String productName; private int ordCnt; private int totalCnt; public int getIdx() { return idx; } public String getProductName() { return productName; } public int getOrdCnt() { return ordCnt; } public int getTotalCnt() { return totalCnt; } public Product(int idx, String productName, int ordCnt, int totalCnt) { this.idx = i..
쿠버네티스 배포 전략 쿠버네티스 배포의 장점 중 하나는 무중단 배포이다. 쿠버네티스가 무중단 배포를 진행하는데에 사용하는 전략은 총 2가지가 있다. 미리 말해두자면, 앞으로 설명할 전략 중 재생성 전략은 무중단 배포로 볼 수가 없다. 2가지 전략에 대해 간단히 알아보자. 롤링 업데이트 전략 (Rolling Update) .spec.strategy.type==RollingUpdate 쿠버네티스 배포 전략의 default 전략이다. 여러개로 띄어져있는 pod 들을 정해진 개수만큼 새로운 pod를 띄우고, 기존의 pod를 종료시킨다. 새로운 pod가 띄어지면서 기존의 pod가 삭제되어 여러 버전의 pod가 띄어져있을 수 있는 전략이다. 하지만 이런 방식으로 인해 2가지 버전의 pod가 실행되어 사용자에게 혼란..
JPA 처음 적용해보기 Spring, SpringBoot 프레임워크가 아닌 기본 Java 프로젝트의 main 함수로 JPA를 구현해보자. resources/META-INF/persistence.xml Member Entity package hellojpa; import javax.persistence.*; @Entity @Table(name="MEMBER") public class Member { @Id @Column(name = "ID") private String id; @Column(name = "NAME") private String username; public String getId() { return id; } public void setId(String id) { this.id = id; ..
스프링 부트 스프링 부트의 기반은 스프링 프레임워크다. 스프링 프레임워크는 의존성 주입(Dependency Injection) 개념을 기반으로 되어있고, XML 구성파일을 사용한다. 기능이 점차 증가되면서 XML 구성 파일을 사용하는건 점점 부담이되어, 스프링부트가 출시되었다. 스프링 부트는 스프링 프레임워크 + 서드파티(제 3자의 기업) 제품으로 구성되어있고, 핵심 모듈의 설정 방식을 개선하여 빠르게 개발할 수 있도록 스프링 프레임워크 보다 개선된 프레임워크다. 스프링 부트는 기본 구성이 적용되어있어, 추가적인 설정을 최소화하고 필요한 경우에만 구성을 작성한다. 또한 독립형 JAR 파일 기반의 런타임 모델도 지원한다. (이전에는 WAR 파일로 배포 및 실행) @SpringBootApplication 스..