목록전체 글 (149)
Taking baby-developer steps
스프링에서 중요한 콘셉트로는 제어의 역전(IoC)과 의존성 주입(DI)이 있다. IoC(Inversion of Control) 스프링 컨테이너가 객체를 관리할 때, 외부에서 관리하는 객체를 가져와 사용하는 것을 말한다. DI(Dependency Injection) IoC를 구현하기 위해 사용하는 방법. 스프링 컨테이너에서 객체를 주입해서 사용한다. 일반적인 자바 코드는 클래스 내에서 어떤 객체를 쓰고 싶은 경우 직접 생성하지만, 스프링의 경우 스프링 컨테이너에서 객체를 주입받아 사용한다. 이것을 IoC/DI 개념이라고 하며 스프링의 핵심 개념이라고 할 만큼 중요하다. 스프링 컨테이너는 뭘까? 빈을 생성하고 관리하는 주체. 빈이 생성되고 소멸하기까지의 생명주기를 관리한다. 빈은 뭔데? 스프링 컨테이너가 생..
타입은 개념이다 어떤 객체에 타입을 적용할 수 있을 때 그 객체를 타입의 인스턴스라고 한다. 개념과 마찬가지로 심볼, 내연, 외연을 이용해 표현할 수 있다. 근본적으로는 개념과 동일 하지만 이를 컴퓨터로 옮기면서 다음과 같은 형태로 나타낸다. 데이터 타입 컴퓨터는 0, 1만으로 데이터를 저장한다. 이에 의미를 부여하기 위해 우리는 "타입 시스템(type system)"을 만들었다. 타입 시스템은 0과 1만으로 이루어진 데이터를 목적에 따라 분류하기 위해 만들었다. 이를 통해 메모리 안에 저장된 0과 1에 대해 '수행가능한 작업'과 '불가능한 작업'을 구분해 데이터가 잘못 사용되는 것을 방지한다. 데이터 타입은 "종류를 분류"하는데 사용하는 메타데이터이다. 데이터에 대한 분류는 어떤 종류의 연산을 수행 할..
글의 주제 : IDL을 이용한 효율적인 인터페이스 관리 전략 https://blog.gangnamunni.com/post/saas-why-do-frontend-developers-design-api/ [SaaS] 프론트엔드 개발자가 API를 설계하는 이유 IDL을 이용한 효율적인 인터페이스 관리 전략 by 강남언니 블로그 blog.gangnamunni.com 이 글에서 인상 깊었던 점은 "프론트엔드가 주도하여 인터페이스를 설계하는" 개발의 이점을 소개해주었다는 것이다. 이를 통해 프론트엔드 개발자의 업무 블락커 발생을 줄이고 API가 백엔드 개발자에게 종속되는 것을 막을 수 있음을 알려주었다. 이 글을 읽으며 지난 웹 채팅 프로젝트가 생각이 났다. 이 프로젝트에서 나는 프론트엔드 주도 인터페이스 설계를 ..
엔터프라이즈 애플리케이션이란? 대규모의 복잡한 데이터를 관리하는 애플리케이션을 말한다. 예시로 은행 시스템을 생각해보자. 동시에 몇 백만, 몇 천만의 사람이 한꺼번에 잔고를 조회하고, 입금, 출금 요청을 한다. 엔터프라이즈 애플리케이션은 많은 사용자의 요청을 동시에 처리해야한다. 따라서 서버 성능과 안정성, 보안이 매우 중요하다. 이것을 신경 쓰며 사이트 기능, 비즈니스 로직까지 개발하기는 매우 어렵다. 스프링의 등장 서버 성능, 안정성, 보안을 매우 높은 수준으로 제공하는 도구. 이 덕에 개발자들은 기능 개발에 집중할 수 있게 됐다. 장점이 많은 개발 도구이지만 설정이 매우 복잡하다. 그래서 스프링 개발팀에서도 이런 단점을 인식하고 단점을 보완하고자 스프링 부트를 출시했다. 스프링 부트 스프링 프레임워..
분류는 객체지향의 가장 중요한 개념 중 하나다. 어떤 객체를 어떤 개념으로 분류할지가 객체지향의 품질을 결정한다. 분류를 적절한 개념에 따라 분류하지 못한 애플리 케이션은 유지보수가 어렵고 변화에 쉽게 대처하지 못한다. 적절한 분류체계는 애플리케이션을 다루는 개발자의 머릿속에 객체를 쉽게 찾고 조작할 수 있는 지도를 제공하는 셈이다. 최대한 직관적으로 분류하는 것이 중요하다. 분류는 추상화를 위한 도구 추상화가 2가지 차원에서 이뤄진다고 했다. 분류 또한 추상화의 2가지 차원을 모두 사용한다.
도커를 한마디로 정의하자면 "데이터 또는 프로그램을 격리시키는 기능"을 제공하는 소프트웨어이다. 프로그램을 격리하는 주체를 컨테이너라고 하며, 이 컨테이너를 다루는 기능을 제공하는 소프트웨어가 도커이다. 도커를 사용하려면 도커 소프트웨어의 본체인 도커 엔진을 설치해야한다. 도커 엔진 외에도 "이미지"가 필요한데, 컨테이너를 만들 틀 같은 존재라고 생각하면 된다. 용량이 허락하는 한 하나의 도커에서 여러개의 컨테이너를 만들 수 있다. 도커는 내부적으로 리눅스를 사용한다. 따라서 컨테이너 내부에서도 리눅스만 동작 가능하다. 서버 환경 격리가 왜 필요한가 서버 구축시 설계할 때는 문제가 없던 프로그램끼리도 실제로 설치하면 오류가 발생하는 일이 있다. 대부분 문제의 원인은 "프로그램 간 공유"에 있다. 일반적 ..
세상에는 수 많은 객체들이 있다. 우리는 이 모든 것을 각자 고유한 개별적 단위로 매번 취급하기에는 인지능력이 턱 없이 부족하다. 이때 공통적인 특성을 기준으로 객체를 여러 그룹으로 묶어 동시에 다뤄야하는 가짓수를 줄임으로써 상황을 단순화 할 수 있다. 예를 들어 "사과, 강아지, 해달, 귤, 토끼, 판다, 딸기"가 있을 때 이들을 "과일, 동물"로 묶어서 단순화 할 수 있다. 개념(Concept), 인스턴스(Instance) 객체들을 공통점으로 묶기위한 관념을 말한다. 개념을 이용하면 객체를 여러 그룹으로 분류(Classification)할 수 있다. 사과, 귤, 딸기는 "과일"이라는 개념으로 분류할 수 있고, 강아지,해달,판다 는 "동물"이라는 개념으로 분류할 수 있다. 개념은 객체를 분류할 수 있는..
추상화가 왜 중요할까? 현대의 지하철 노선도를 생각해보자. 실제 지형, 축적은 무시하고 역 사이 연결성에만 집중해있다. 승객들은 지하철을 갈아탈 때 지형, 축적은 관심이 없다. 중요한 것은 역의 순서와 갈아타는 역이다. "승객"이 꼭 "알아야 하는 사실"만 정확하게 표현하고 몰라도 되는 정보는 무시함으로서 이해하기 쉽고 단순하며 목적에 부합한다. 복잡성을 극복하는 추상화 추상화란 불필요한 부분을 가지치기해 사물의 본질을 드러나게 하는 과정이다. 현실에 존재하는 복잡성을 극복할 수 있다. 가장 좋은 추상화는 "목적에 부합"하는 것이다. 이 책에서는 추상화를 다음과 같이 정의한다. 추상화 : 양상, 세부사항, 구조를 좀 더 명확하게 이해하기 위해 특정 절차나 물체를 의도적으로 생략하거나 감춤으로써 복잡도를 ..
객체 지향에서 상태를 먼저 결정하고 행동을 나중에 결정하는 것은 다음과 3가지 이유로 설계에 나쁜 영향을 미친다. 1. 캡슐화 저해 상태에 초점을 맞출 경우, 상태가 객체 내부에 깔끔하게 캡슐화 되지 못하고 공용 인터페이스에 그대로 노출될 수 있는 위험이 높아 진다. 2. 협력성 저하(고립된 섬으로서의 객체) 객체는 협력자여야한다. 존재 이유 자체가 다른 객체와 협력하기 위함이다. 상태를 먼저 고려하게 되면 문맥에서 벗어난 객체가 될 위험이 커진다. 3. 재사용성 저하 재사용성은 협력할 수 있는 능력에 좌우된다. 상태에 초점을 맞춘 객체는 다양한 협력에 참여하기 어렵고 재사용성이 저하된다. 객체는 "협력"하기 위해 존재하며, "행동"이 협력에 참여하는 유일한 방법이다. 우리가 애플리케이션 안에서 어떤 행..
스택 구현 -> 파이썬의 list 적합. .append() , .pop() 메서드의 시간 복잡도는 O(1) 이므로 스택 자료구조로 활용하기 적합하다. 큐 구현 -> 파이썬의 deque 적합. list보다 시간복잡도가 낮다. list의 append와 동일하게 동작. 상수시간. popleft는 가장 먼저 들어온 자료를 꺼내는 함수. 마찬가지로 상수시간. 재귀함수 -> 스택 대신 사용할 수 있음 -> 실제 코테중 콜백 수 제한이 있어서 당황해서 dfs 문제를 포기해 버렸다..! 이번 기회에 큐 및 스택으로 문제 푸는 법을 익히고 싶다. --> 파이썬에서는 최대 재귀 깊이가 정해져 있기 때문에 초과 메시지가 출력된다고 한다..! -> c++만 쓰다가 파이썬이 처음이라 몰랐다..! 재귀 제한을 느슨하게 만들거나 ..