본문 바로가기

728x90

JAVA

(16)
API Gateway 개념 1. 나오게 된 배경 고객 서비스를 위한 다양한 클라이언트가 나오기 시작했고, 서비스를 위해 필요한 다양한 정보들을 요구하기 시작했다. 이에 MSA가 유행하기 시작한다. 여기서 MSA란 마이크로하게 나눈 독립적인 서비스를 의미한다. 하지만 문제점이 발생한다. 클라이언트와 MSA간의 강한 결합이 있고, 너무 많은 통신을 요구하게 된다. 개별 서비스의 엣지 기능 제공 및 구현(보안, 로깅, 모니터링, 캐싱 등)이 어려워졌다. 무엇보다 결합이 크면 변경이 어렵기에 새로운 무언가가 필요했다. 이를 해결하기 위해 API Gateway 패턴이 등장한다. 2. API Gateway란? 크게 두 가지 기능을 제공한다. 첫 번째는 단일접점으로 마이크로 서비스를 모아서 단일접점을 제공한다. 두 번째는 캡슐화로 클라이언트 ..
특정 제품만 조작이 가능하게끔 권한 주기. 1. 특정 병원 번호만 어떻게 조작이 가능하게 할 것인가? 이걸 어떻게 구현할지 감이 안 온 나는, 우아한형제들 기술이사 김영한 님의 강의를 평소에 보고 있어서 아래와 같은 조언을 얻었다. 어떤 방법을 사용하든 권한 체크는 서버에서 추가로 해주어야 한다. 병원의 고유 번호(ex.5764)를 가진 사람이 5764번 병원만 정보를 수정하게끔 할 수 있는가 없는가에 대한 판단도 서버에서 모두 계산해서 클라이언트로 내려주는 것이 좋다. 2. 테이블 설계 먼저 아래와 같이 테이블을 설계했다. MemberAuthority 엔티티의 hospitalNo는 병원 번호를 뜻한다. ROLE_MANAGER(병원 관계자) 권한을 가진 사용자만 병원 번호를 가질 수 있다. 멤버는 권한에 따라 여러 개의 권한을 가진다. 예를 들어..
Optional 개념과 활용 1. 정의 public final class Optional { private final T value; } T타입 객체의 래퍼 클래스. T타입의 참조변수를 갖고 있다. T value의 의미는 모든 종류의 객체 저장 가능하다. 참고로 래퍼 클래스는 기본 타입에 해당되는 데이터를 객체로 포장해주는 클래스이다. ex) Integer, Long. Optional을 왜 사용하냐면 null을 직접 다루는 것은 위험하기에(NullPointerException 문제) 객체에 담아서 간접적으로 null을 다룰 수 있다. 기존에 null 체크를 하면 코드가 지저분했기에 Optional을 자주 사용하는 편이다. 2. 활용 예시 1) Optional 객체 생성하기 String str= "hello"; Optional opt..
스트림(Stream) - 최종 연산(3/3) 1. 최종 연산 Terminal Operation. 연산결과가 스트림이 아닌 연산, 단 한 번만 적용가능하다. 스트림의 요소를 소모한다. forEach(): 지정된 작업 수행. forEachOrdered(): 순서 유지. 병렬 스트림으로 처리할 때 작업 순서를 유지할 때 사용. forEach와 마찬가지로 지정된 작업을 수행한다. count(): 요소의 개수 반환. max(), min(): 최대값/최소값 반환. findAny(): 아무거나 하나 스트림의 요소를 반환. findFirst(): 첫번째 요소를 반환. allMatch(): 주어진 조건을 모두 만족하는지. anyMatch(): 주어진 조건들을 하나라도 만족하는지. noneMatch(): 모두 만족하는지 않는지. toArray(): 스트림의 모든 요..
스트림(Stream) - 중간 연산(2/3) 여기서부터 진짜 중요한 내용입니다. 실무에서 자주 사용되는 문법이니 꼭 인지하시는 걸 추천드립니다. 1. 스트림의 연산 중간 연산과 최종 연산이 있습니다. 중간 연산: 연산결과가 스트림인 연산. 반복적으로 적용 가능합니다. 최종 연산: 연산결과가 스트림이 아닌 연산. 단 한번만 적용가능합니다. Stream.distinct().limit(5).sorted().forEach(System.out::println) 주황색은 중간 연산을 표시하고 3개를 표현했습니다. (N개 가능) 빨간색은 최종 연산이며 1개만 올 수 있습니다. 2. 중간 연산 distinct(): 중복을 제거한다. filter(Predicate predciate): 조건에 안 맞는 요소를 제거 limit(long maxsize): 일부를 잘라낸..
스트림(Stream) - 개념(1/3) 1. 개념 스트림은 데이터의 연속적인 흐름. 다양한 데이터(컬렉션 배열 등)를 표준화된 방법으로 다룰 수 있다. List list = Arrays.asList(5,12,13,57); 위의 코드는 Integer 요소가 있는 list를 표현한 것이다. 형태가 list로 고정됐다. Stream intStream = list.stream(); // 컬렉션 Stream strStream = stream.of(new String[]{"apple","cd","melon"}); //배열 Stream intStream = stream.iterate(0,n->n+3); //0,3,6,9 Stream intStream = stream.generate(Math::random); //람다식 반면 스트림은 어떤 형태든 변화할 수..
Generics 지네릭스 - 와일드 카드 및 메소드 (2/2) 1. 와일드 카드 정의 하나의 참조 변수로 대입된 타입이 다른 객체에 참조가 가능하다. 와일드 카드의 종류는 세 가지이다. : 제한이 없다. 모든 타입이 가능하다. TV가 Item의 자손임을 가정했을 때 ArrayList list = new ArrayList(); //에러 발생 지네릭을 선언하고, 위의 코드를 작성하면 타입이 불일치라 에러가 발생했다. 그러나 와일드 카드는 이 한계를 넘어설 수 있다. ArrayList
Generics 지네릭스 - 개념 및 활용 (1/2) 1. 개념 컴파일 시 타입을 체크해주는 기능이다. 아래와 같이 News 객체만 저장할 수 있는 ArrayList를 제네릭스를 활용해 구현해 봤다. ArrayList newslist = new ArrayList(); newslist.add(new News("h")) // 가능 newslist.add(new SportsNews("h")) // 컴파일 에러 이런 식으로 제네릭스를 통해 오직 News 객체만 담을 수 있다. 그러면 이걸 왜 사용할까? 아래의 예시를 살펴보자. ArrayList newslist = new ArrayList(); newslist.add(new News("h")); News n = (News)newslist.get(0); News n = newslist.get(0)으로 하면 컴파일 에..

728x90