데브코스 7일차

지두현님의 Modern Architecture특강

HW따지지말고 잘 맞는걸로 설계하라. 즉, 환경에 맞게 설계를 하는 것이 Modern Architecture다.

각각의 과정을 거치면서 발전이 아닌 발견에 의한 유행의 이동이 이뤄졌다.

대세인 아키텍쳐만 쓰이는 것은 아니다. 상황에 따라 monolithic한 아키텍처나 msa한 아키텍처를 사용한다.

MSA

service

business capabilites

product(!project)(이 서비스로 가치를 창출한다면 프로덕트다)

endpoints(다른 서비스와 연결을 고려)

decentralized gvernance(언어 종속X)

decentralized data(데이터는 공통으로 쓰지 않는다, DB를 분산시켜서 사용, 공통된 DB를 사용하지 않는다)

infrastructure automation

design for failure(실패에 대한 대안이 준비되어야 한다, msa에선 product간에 transaciton은 없다, transaction이 없으니 rollback같은 기능은 없다, 그래서 그걸 대비해야한다)

evolutionary design

결론) msa는 managements는 centralize, r&rs(업무분장)은 decentralize해야 한다.
(서비스는 각 팀이 맡아서 개발하지만 로깅이나 상태체크는 중앙화해야 한다)

EDA

loosely coupling among services by data/event driven.

serverless

Reduce managing cost cost based on cloud services.

Architecture Application

Monolithic Serverless (5~50)
MSA (50~200, 200~1,000)
EDA Serverless(over 1000)

Java Collection

Collection

Collection에는 주어지는 타입에 따라 해당 타입의 데이터가 여러개 들어 갈 수 있습니다.
추상체라고 하는데, 그 이유는 Collection 자체는 인터페이스라서 그렇습니다.

	// java.util안의 collection 선언부분
	public interface Collection<E> extends Iterable<E> {
    ...
    }

Collection을 상속받는 녀석들은 List, Queue, Set 등이 있습니다.

	List<T>?
    
    List<String> list = new List<>(); O
    List<Integer> list = new List<>(); O

Collection에서 보이는 <T>는 제네릭으로 어떤 데이터 타입이 들어와도 상관이 없단 표현입니다. 위 코드에서도 알 수 있듯이 <>이 꺽쇠 내부에는 String나 Integer가 들어와도 상관이 없습니다.

Iterator

Iterator는 연속된 데이터 묶음을 하나씩 꺼내볼 수 있게 해줍니다.

	public interface Iterator<E> {
    	boolean hasNext();
        next();
        default void remove() {
        	throw new UnsupportedOperationException("remove");
    	}
        
        default void forEachRemaining(Consumer<? super E> action) {
        	Objects.requireNonNull(action);
        	while (hasNext())
            	action.accept(next());
    	}

Iterator의 코드입니다. 메서드 이름에서도 직관적으로 어떤 기능을 하는지 알 수 있습니다.

	List<String> list = new ArrayList<>();

List도 인터페이스니깐 new ArrayList로 구현시켜줘야 합니다. 그리고 ArrayList 코드 내부를 보면 Iterator를 구현시킨 Itr 클래스가 있습니다. 설명은 이쯤하고요.

	list.hasNext();
    String str = list.next();

hasNext()는 리스트 내부에 다음 아이템이 있는지 확인하는 메서드이고 next()는 다음 아이템을 꺼내오는 메서드입니다.

Stream

Stream은 연속된 데이터를 처리해주는 역할을 합니다.

	public interface Stream<T> extends BaseStream<T, Stream<T>> {
    	...
    }

위 코드가 Stream 선언부입니다.

	int[] intArr = Stream.generate(() -> i+1)
    	.limit(20)
        .sorted(Comparator.reverseOrder())
        .mapToint(i -> i)
        .toArray();

요 코드처럼 Stream를 생성 후 원하는 동작을 연속적으로 수행하는 것을 메서드 체이닝이라고 합니다.

결론

Collection, Iterator, Stream은 익명클래스, 익명메서드 그리고 람다식을 사용하여 코드를 작성하기 좋습니다.

가능하다면 위 기법들로 적용할 수 있는 부분은 한번 직접 적용해보며 익숙해지길... ㅠ

profile
이타적인 기회주의자

0개의 댓글