Study Cafe
자료구조/알고리즘, 컴파일러
자료구조/알고리즘, 컴파일러
2023.04.17## 자료구조/알고리즘 ## 1. 배열과 LinkedList(연결 리스트)의 차이 배열은 입력된 데이터들이 메모리 공간에 연속적으로 저장되어 있는 자료구조입니다. index를 통한 접근이 용이하며 배열의 크기는 한 번 정한 이후 변경이 불가능합니다. 연결 리스트는 여러 개의 노드들이 순차적으로 연결된 형태를 갖는 자료구조입니다. 배열과는 다르게 메모리를 연속적으로 사용하지 않습니다. ○ 장단점 *배열 - 인덱스를 통한 빠른 접근이 가능 - 삽입/삭제가 오래 걸림 - 배열 중간에 있는 데이터가 삭제되면, 공간 낭비 발생 *연결 리스트 - 삽입/삭제 용이 - 임의 접근이 불가능하여, 처음부터 탐색을 진행해야 함 ○ 용도 배열: 빠른 접근이 요구되며, 데이터의 삽입과 삭제가 적은 경우 연결 리스트 : 삽입과 ..
Spring
Spring
2023.04.091. Spring DI/IoC는 어떻게 동작하나요? IoC(Inversion of Control), 제어의 역전은 프로그램 제어 흐름을 직접 제어하지 않고 외부에서 관리해주며, 코드의 최종호출은 개발자가 제어하는 것이 아닌 프레임워크 내부에서 결정한 대로 이루어집니다. DI(Dependency Injection)는 Spring 프레임워크에서 지원하는 IoC 형태로 클래스 사이의 의존관계를 Bean 설정 정보를 바탕으로 컨테이너가 자동으로 연결해줍니다. 2. IoC 컨테이너의 역할은 무엇인가요? 어플리케이션 실행시점에 빈 오브젝트를 인스턴스화하고 DI한 후에 최초로 어플리케이션을 기동할 빈 하나를 제공해주는 역할을 합니다. 3. DI 종류는 어떤 것이 있고, 이들의 차이는 무엇인가요? DI는 3가지 방법(..
chap15 & chap16-라이브러리 분석을 통해 코드를 바라보는 시각 기르기
chap15 & chap16-라이브러리 분석을 통해 코드를 바라보는 시각 기르기
2023.04.09목차 책 내용 요약 오픈 소스 접근법 Spring 프로젝트 접근법 1. 책 내용 요약 15장 Junit 들여다보기 ○ 세상에 완벽한 코드는 없다 의도를 명확하게 표현하기 위해 조건문을 메서드로 분리 전후 단계가 있는 변수들 사이 시간적인 결합(hidden temporal coupling)을 해결하기 위해 리팩토링 더 적절한 의미로 네이밍 변경 불필요한 연산을 하는 코드 제거 16장 SerialDate 리팩토링 ○ 남의 코드를 비판하고, 내 코드의 비판을 듣는 건 편안하게 여겨야 할 활동이다 2. 오픈 소스 접근법 같이 읽기 출처: https://www.popit.kr/%EC%98%A4%ED%94%88%EC%86%8C%EC%8A%A4-%EC%BD%94%EB%93%9C-%EB%B6%84%EC%84%9D-%E..
chap14-점진적인 개선
chap14-점진적인 개선
2023.04.07목차 책의 예제 점진적으로 개선하기 IDE를 활용해 점진적으로 개선하기 1. 책의 예제 명령형 인수 구문 분석기 코드 초안 모든 로직이 하나의 클래스에 들어가 있다. 처음부터 지저분한 코드를 짜려는 생각은 없었고, 코드를 어느 정도 손봤지만 새로운 인수 유형이 들어오면서 문제가 발생했다. 이제는 개선해야 할 때라는 걸 깨닫고, 변경 전후 시스템이 동일하게 돌아간다는 사실을 확인하기 위해 테스트들을 작성해두었다. 점진적으로 개선해나갔다. 코드 완성본 Args 클래스에서 코드 중복을 최소화하고, ArgsException 클래스를 분리했다. ArgumentMarshaler 클래스를 통해 여러 인수에 대한 추후 확장성을 만들어냈다. 코드만 분리해도 설계가 좋아진다. 관심사를 분리하면 코드를 이해하고 보수하기 훨..
chap13-동시성
chap13-동시성
2023.04.07목차 동시성 프로그래밍이란 동시성 프로그래밍이 필요한 이유 안전한 동시성 프로그래밍 규칙 동시성 테스트 방법 오픈소스 속 동시성 처리 1. 동시성 프로그래밍이란 동시성 프로그래밍 어플리케이션을 효율적으로 실행하기 위해 멀티코어를 온전히 활용하도록 구현하는 방식 외부 서비스의 응답을 기다리면서 아무일도 하지 않으면 CPU 사이클이 낭비된다 동시성 프로그래밍 이해하기 동시성이 구현되지 않은 경우 병렬성을 구현한 경우 동시성을 구현한 경우 동시성과 병렬성이 구현된 경우 => 클라이언트가 아닌 어플리케이션 관점에서 봐야 한다. 내 어플리케이션의 효율성을 높이고 더불어 내 어플리케이션이 동작하는 머신의 환경이 효율적으로 돌아가도록 메모리 누수나 자원이 낭비되지 않도록 한다. 2. 동시성 프로그래밍이 필요한 이유 ..
chap12-창발적 설계
chap12-창발적 설계
2023.03.31목차 창발적 설계란 모든 테스트를 실행한다 중복을 없앤다 의도를 표현한다 실용적 관점에서 타협한다 1. 창발적 설계란 창발성(Emergence) 하위 계층에는 없는 특성이나 행동이 상위 계층(전체 구조)에서 자발적으로 돌연히 출연하는 현상 각각의 개미는 집을 지을 능력이 없지만, 작은 개미들의 상호작용을 통해 집이라는 결과물이 나오는 것처럼 작은 요소들의 상호작용 반복이 전체구조에 영향을 미친다. 창발적 설계 단순한 4가지를 반복하다보면 전체적으로 깨끗한 코드가 만들어진다 모든 테스트를 실행한다. 중복을 없앤다. 프로그래머 의도를 표현한다. 클래스와 메서드 수를 최소로 줄인다 (실용적 관점에서 타협한다). 2. 모든 테스트를 실행한다 모든 테스트 케이스를 항상 통과하는 시스템은 '테스트가 가능한 시스템'..
chap11-관심사 분리 패턴들
chap11-관심사 분리 패턴들
2023.03.30목차 관심사 분리 Dependency Injection Cross Cutting Concerns 1. 관심사 분리 관심사 분리 construction(생성)과 use(사용)은 아주 다르다 소프트웨어 시스템은 (어플리케이션 객체를 제작하고 의존성을 서로 '연결'하는) 준비 과정과 (준비 과정 이후에 이어지는) 런타임 로직을 분리해야 한다. 객체의 생성과 객체를 사용하는 부분을 분리한다. 시작에 대한 관심사 분리 시작 단계는 모든 어플리케이션이 풀어야 할 관심사이다. main 함수에서 시스템에 필요한 객체를 생성한 후 어플리케이션에 넘긴다. 어플리케이션은 그저 만들어진 객체를 사용한다. 모든 객체가 잘 생성되었다는 가정하에 객체를 이용한 개발에 집중할 수 있다. 요청에 대한 관심사 분리 Spr..
chap10-클래스 잘 설계하기
chap10-클래스 잘 설계하기
2023.03.29목차 캡슐화되어야 한다 단일 책임 원칙 낮은 결합도와 높은 응집도 변경하기 쉬워야 한다 1. 캡슐화되어야 한다 캡슐화 : 객체의 실제 구현을 외부로부터 감추는 방식 클래스를 개발할 때 기본적으로 구현을 감추고, 외부 객체와 상호작용하는 부분만 노출한다. 외부의 잘못된 사용을 방지한다. 필드를 private으로 제한, get으로 읽기. 수정은 push, pop 메서드를 통해서 일어나도록 제한. 2. 단일 책임 원칙 클래스는 작아야 한다 함수와 마찬가지로 클래스도 작아야 한다. 함수는 라인 수로 크기를 측정했는데, 클래스는 맡은 책임의 수로 크기를 측정한다. 클래스 설명은 만일(if), 그리고(and), 또는(or), 하지만(but)을 사용하지 않고 25단어 내외로 가능해야 한다. => 책임이 한 가지여야 ..
chap09-깨끗한 테스트 코드
chap09-깨끗한 테스트 코드
2023.03.28목차 테스트 코드의 중요성 테스트의 종류 Unit Test의 작성 FIRST 원칙 오픈소스 속 Unit Test 1. 테스트 코드의 중요성 테스트 코드는 실수를 바로잡아준다. 테스트 코드는 반드시 존재해야 하며, 실제 코드 못지 않게 중요하다. (테스트 코드 짜는 연습을 많이 해야 함) 테스트 케이스는 변경이 쉽도록 한다. 코드에 유연성, 유지보수성, 재사용성을 제공하는 버팀목이 바로 단위테스트다. 테스트 케이스가 있으면 변경이 두렵지 않다. 테스트 케이스가 없다면 모든 변경이 잠정적인 버그다. 테스트 커버리지가 높을수록 버그에 대한 공포가 줄어든다. 지저분한 테스트 코드는 테스트를 안하는 것만도 못하다. 테스트는 자동화되어야 한다. 2. 테스트의 종류 Unit Test: 프로그램 내부의 개별 컴포넌트의..
chap08-경계
chap08-경계
2023.03.28목차 경계란 경계 짓기 (1) 우리 코드를 보호하기 경계 짓기 (2) 우리 코드를 보호하기 외부 라이브러리 테스트하기 1. 경계란 오픈소스, 라이브러리를 안쓰는 프로젝트는 없다. 우리가 만든 코드에 외부에서 들어온 코드를 병합해야 한다. 외부 코드는 외부에서 만든 코드인데, 외부 시스템과 호출하거나 단순히 외부에서 만들어진 코드일 수 있다. 우리 코드와 외부 코드를 깔끔하게 통합시키기 위해 경계를 잘 지어야 한다. 2. 경계 짓기 (1) 우리 코드를 보호하기 ○ 캡슐화(Encapsulation) 객체의 실체 구현을 외부로부터 감추는 방식 ○ Sensor를 관리해야 한다. Sensor는 외부에서 사용된다 Sensor Id와 Sensor 객체로 저장하고 싶어서, Map을 사용한다. 하지만 Map을 그대로 사..
데이터베이스 + JPA
데이터베이스 + JPA
2023.03.271. 데이터베이스에서 인덱스를 사용하는 이유 및 장단점 데이터베이스에서 인덱스를 사용하는 이유는 검색 성능을 향상시키기 위함입니다. 검색 성능을 향상시키기 위해서는 해당 쿼리가 index를 사용하는지, 카디널리티 또는 selectivity와 같은 요소들이 고려된 인덱스가 생성되어야 합니다. 인덱스를 사용하여 얻을 수 있는 장점으로는 빠른 검색 속도 향상입니다. 단점으로는 추가 저장공간이 필요합니다. 그리고 insert, update, delete 등의 변동 사항이 있는 경우 성능이 저하됩니다. * 인덱스를 어느 컬럼에 사용하는 게 좋을까? 인덱스는 where 절에서 '자주 조회'하고 '수정 빈도'가 낮으며 '데이터 중복'이 적은 컬럼을 선택하는 것이 좋습니다. join 조건으로 자주 사용되는 컬럼도 인덱..
chap07-오류 처리
chap07-오류 처리
2023.03.24목차 예외 처리 방식 Unchecked Exception을 사용하라 Exception 잘 쓰기 실무 예외 처리 패턴 오픈소스 속 Exception 살펴보기 1. 예외 처리 방식 ○ 오류 코드를 리턴하지 말고, 예외를 던져라 옛날에는 오류를 나타낼 때 에러코드를 던졌다. 하지만 예외를 던지는 것이 명확하고, 처리 흐름이 깔끔해진다. ○ 예외를 던지고, 처리하는 방식 오류가 발생한 부분에서 예외를 던진다. 별도의 처리가 필요한 예외라면 checked exception으로 던진다. checked exception에 대한 예외처리를 하지 않는다면 메서드 선언부에 throws를 명시해야 한다. 예외를 처리할 수 있는 곳에서 catch하여 처리한다. 2. Unchecked Exception을 사용하라 ○ Excep..