목록전체 글 (124)
지나공 : 지식을 나누는 공간
코루틴(Coroutine)? 실행의 지연과 재개를 허용함으로써, 비선점적 멀티태스킹을 위한 서브 루틴을 일반화한 컴퓨터 프로그램 구성요소. 이제 진하게 칠한 단어를 하나씩 공부해보자! 1. 루틴과 서브루틴? 프로그램은 보통 크고 작은 여러가지의 루틴을 조합시켜서 성립되는데 여기서 메인 루틴과 서브루틴으로 나뉜다. 메인 루틴 : 프로그램 전체의 개괄적인 동작 절차를 표시하도록 만들어진 루틴. 서브 루틴 : 반복적인 특정 기능을 모아서 별도로 묶인 루틴. 서브 루틴은 별도의 메모리에 해당 기능을 모아 놓고 서브루틴이 호출될 때마다 저장된 메모리에 이동한 뒤 다시 return을 통해 원래 호출자의 위치로 돌아온다. 서브루틴은 함수와 비슷하다. 코루틴도 루틴의 일종인데, 3가지 차이점이 존재한다. 메인 - 서브..
REST API 의 장점 학습과 사용이 매우 쉽다. 자유도가 높아 원하는 대로 사용 가능하다. json이 응답으로 오면 파싱할 필요도 없다. REST API의 문제점 너무 자주 바뀌는 API (서버에서 자꾸 변경할 때가 많음) 너무 높은 자유도 버저닝(이 가능하긴 하나 손이 너무 많이 감) api 문서를 만들 수는 있으나 코드랑 너무 떨어져 있으니 죽은 문서가 됨 그래서 나온 게 바로 IDL(Interface Description Language) 라고 하는 인터페이스 정의 언어이다. 이것의 큰 장점은 언어에 종속되지 않고 컴포넌트 사이의 통신을 가능하게 한다. 그럼 우리는 이 rest api를 어떤 idl을 사용해서 표현할 수 있을까? 라는 고민을 한다. 첫 번째는 open API로, 그 장점은 아래와..
Stack and Queue가 뭔가? 스택은 LIFO(Last in First Out) 형식의 자료구조고, 큐는 FIFO(First In First Out)형식의 자료구조다. 만약 스택에 데이터가 하나도 없는데 pop을 하면 어떻게 되는가? 즉, 비어있는 스택을 참조하면 무슨 일이 일어날까? 비어 있는 스택에서 데이터를 pop하면 Stack Overflow가 발생한다. 스택 오버플로우는 언제 발생하는가 비어 있는 스택에서 pop할 때 스택의 최대 사이즈를 넘겼을 때 재귀함수를 무한 호출하거나 너무 큰 지역변수 혹은 매개변수를 사용할 때 ~와 같은 상황이면 스택/큐 중에 뭘 쓰는게 나은가? 스택의 활용 웹 브라우저 방문기록, 역순 문자열 만들기, 수식의 괄호 검사*, 메모리의 스택영역* 큐의 활용 우선순위..
프로세스와 스레드란? 프로세스 : 실행 중에 있는 프로그램을 의미로 스케줄링의 대상인 task(작업)과 같은 의미로 사용된다. 각각 독립된 메모리 영역을 할당받고, 프로세스마다 최소 1개의 스레드(메인스레드)를 가진다. 각 프로세스는 별도의 주소 공간에서 실행되어서 다르 프로세스의 변수나 자료구조에 접근할 수 없다. 한 프로세스가 다르 프로세스에 접근하려면 IPC를 사용해야 한다.(inter process communication) 스레드 : CPU 사용의 기본 단위로, 프로세스 내에서 실행되는 여러 흐름의 단위다. 프로세스 내에서 각각 stack만 따로 할당받고 code, data, heap은 공유한다. 스레드가 여러 개면 멀티스레드이고, 멀테스레드에서는 각 스레드끼리 프로세스의 일정 메모리를 공유한다..
DBMS란? 데이터베이스 관리 시스템. MySQL, Oracle 등등 RDBMS란? 관계형 데이터베이스 시스템으로 key와 value들의 간단한 관계를 테이블화 시킨 데이터베이스다. 각각의 테이블끼리 서로 관계를 맺을 수 있다. 정규화와 반정규화가 뭔가? 정규화 : 불필요한 데이터를 제거하고 중복을 최소화해서 각종 이상 현상을 방지하는 것. 반정규화 : 시스템 성능을 향상시키기 위해 데이터 모델을 통합하는 과정. 정규화를 하면 정합성과 데이터 무결성이 보장되지만 테이블이 복잡해지고 성능이 떨어질 수 있다. 반정규화는 테이블이 단순해지고 성능이 향상되는 반면 정합성과 데이터 무결성이 보장되지 않을 수 있다. *데이터 무결성 대표적으로 참조 무결성이 있는데 두 테이블의 데이터가 항상 일관된 값을 갖도록 유지..
JPA란? Java Persistence API. 자바 진영의 ORM 기술에 대한 API 표준 명세. 아, ORM을 설명하자면 Object-Relational Mapping으로, 객체는 객체대로 설계하고 관계형 데이터베이스는 관계형 데이터베이스대로 설계했을 때 이 둘 사이를 ORM 프레임워크가 중간에서 매핑하는 것이다. JPA는 아래와 같은 특징이 있는데 자세한 건 아래에서 다루겠다. 1차 캐시와 동일성 보장 -> 동일한 트랜잭션에서 같은 엔티티에 대한 두 번의 조회를 하나의 SQL문으로 수행해서 캐싱을 함. 지연로딩과 즉시로딩을 지원해 JOIN으로 연관객체를 같이 조회할 수 있다. 생산성에 도움이 된다. *Hibernate란? JPA 구현체. ORM 프레임워크 중 하나다. SQL문을 직접 작성하지 않고..
스프링 IoC 컨테이너가 빈을 등록하는 원리는? 스프링은 개발자가 직접 만든 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔이라는 기능을 제공한다. 또 의존 관계도 자동으로 주입하는 @Autowired 라는 기능도 제공한다. 컴포넌트 스캔을 통한 자동 빈 등록 외에도 직접 빈을 등록할 수도 있다. 1. 컴포넌트 스캔 (자동 의존관계 주입) 2. 직접 빈 등록 - xml 또는 설정 파일 용도의 클래스를 생성하여 @Configuration을 붙이고 직접 등록할 메소드에 @Bean을 명시해서 할 수 있음. @SrpingBootApplication안에 @ComponentScan이 있고, 이 어노테이션은 여기서부터 모든 하위 패키지의 클래스를 훓으면서 @Component가 붙은 애들을 찾아 빈으로..
대표 질문은 형광펜 표시했습니다. 한 질문에 대해 파생된 꼬리질문이 많아서, 구분선을 그렸습니다. 객체지향설계의 원칙은? SRP(Single Responsibility Principle) 단일책임 원칙 한 클래스는 하나의 책임만 가진다. 변경이 있을 때 파급효과가 적으면, 다른 곳에 영향을 덜 미치면 단일책임원칙을 잘 따른것임. OCP(Open/closed principle) 개방폐쇄원칙 SW 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다. 확장을 하려면 당연히 기존 코드를 변경하는 것 같지만!!! 다형성을 떠올리자. 인터페이스를 구현한 새로운 클래스를 하나 만들어서 새로운 기능을 구현하잖아? 그런데 문제점이 있다. 구현 객체를 변경하려면 클라이언트 코드를 변경해야 한다는 것이다. 그래서 이걸 ..
지금까지의 흐름, 객체 지향 설계 원칙을 따를 때 의존성 주입이 왜 필요했는지 정리해보자. 지금까지의 흐름과 DI의 필요성 1. 새로운 할인 정책 개발 다형성 덕분에 새로운 정률 할인 정책 코드를 추가로 개발하는 것까진 문제가 없다. 2. 새로 만들어진 정률 할인 정책을 적용할 때 문제 발생 새로 개발한 정률 할인 정책을 적용하려고 했더니, 클라이언트 코드인 주문 서비스 구현체 (OrderSerivceImpl)의 코드도 같이 변경해야 했다. 왜냐면 여기서 직접적으로 DiscountPolicy를 FixDiscountPolicy로 구현하고 있었기 때문이다. 얘를 RateDiscountPolicy로 변경하는 순간 DIP 위반이라는 문제가 발생한다. 3. 관심사의 분리 애플리케이션을 하나의 공연으로 생각하자. ..
김영한 님의 강의를 참고했습니다. 객체지향설계의 원칙은? SRP(Single Responsibility Principle) 단일책임 원칙 한 클래스는 하나의 책임만 가진다. 변경이 있을 때 파급효과가 적으면, 다른 곳에 영향을 덜 미치면 단일책임원칙을 잘 따른것임. OCP(Open/closed principle) 개방폐쇄원칙 SW 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다. 확장을 하려면 당연히 기존 코드를 변경하는 것 같지만!!! 다형성을 떠올리자. 인터페이스를 구현한 새로운 클래스를 하나 만들어서 새로운 기능을 구현하잖아? 그런데 문제점이 있다. 구현 객체를 변경하려면 클라이언트 코드를 변경해야 한다는 것이다. 그래서 이걸 해결해야 한다. 객체를 생성하고 관계를 맺어주는 별도의 조립, 설..