본문 바로가기

전체 글61

소프트웨어 설계 기법: SOLID란? 소프트웨어 설계의 5가지 원칙으로 SOLID라는 것이 있다. 흔히 객체지향 설계 기법으로 알려져 있지만, 꼭 객체지향 소프트웨어 설계에만 한정되는 것은 아니고 절차적 프로그래밍 기법으로도 적용할 수 있다. 설계 원칙을 만들고 공부하고 적용하는 이유는 무엇일까? 예측하지 못한 변경사항이 발생하더라도 유연하고 확장성이 있도록 시스템 구조를 설계하기 위해서다. 좋은 설계란, 기본적으로 시스템에 새로운 요구사항이나 변경이 있을 때 가능한 한 영향받는 부분을 줄이는 것이다. 즉 잘 설계한 시스템은 이해하기 쉽고, 바꾸기도 쉽고, 재사용하기도 쉽다. 1. 단일 책임 원칙 (SRP; Single Responsibility Principle) 객체는 단 하나의 책임만을 가져야 한다. 어떤 클래스를 변경해야 하는 이유는.. 2019. 4. 1.
IoC / DI DI란 Dependency Injection의 약자로, IoC라는 원칙을 구현하기 위한 일종의 패턴이라고 볼 수 있다. 그렇다면 IoC란 무엇일까? IoC IoC란 Inversion of Control의 약자로, 객체를 생성하고 객체 간의 의존 관계를 맺어주는 등의 작업을 프레임워크가 대신 해준다는 것이다. 관련된 metadata(설정 정보)를 만들어 놓으면, 그것을 기반으로 Spring Container(혹은 IoC Container), 혹은 프레임워크가 해당 작업을 대신한다는 원칙이다. 개발자가 직접 객체를 생성하고 의존 관계를 맺어줄 필요가 없다. 전통적인 프로그래밍에서는, 개발자가 작성한 코드에서 → 라이브러리를 호출했다면, IoC는 프로그램의 흐름을 프레임워크가 제어하고, 프레임워크에서 → 개발.. 2019. 3. 7.
Spring MVC 동작원리 / 구성요소 Spring MVC의 동작 원리1. DispatcherServlet이 브라우저로부터 요청을 받는다. 2. DispatcherServlet은 요청된 URL을 HandlerMapping 객체에 넘기고, 호출해야 할 Controller 메소드(핸들러) 정보를 얻는다. 3. DispatcherServlet이 HandlerAdapter 객체를 가져온다. 4. HandlerAdapter 객체의 메소드를 실행한다. ※ 보다 정확하게 표현한다면, HandlerMapping은 DispatcherServlet로부터 전달된 URL을 바탕으로 HandlerAdapter 객체를 포함하는 HandlerExecutionChain 객체를 생성하며, 이후 DispatcherServlet이 HandlerExecutionChain 객체로.. 2019. 3. 7.
트랜잭션(Transaction)이란? "하나의 논리적 작업 단위를 구성하는 일련의 연산들의 집합""한 단위를 이루는 일련의 연관된 데이터베이스 연산(조작)" 트랜잭션은 왜 중요할까? 만약 트랜잭션을 하나씩 순차적으로, 한 트랜잭션 끝나고 다음 트랜잭션, ... 과 같이 수행한다면, 프로그램의 속도가 매우 느려질 것이다. DBMS는 CPU보다 I/O 작업을 더 빈번하게 수행하기 때문이다. 따라서 트랜잭션을 순차적으로, 직렬로 수행할수록 CPU가 노는 시간(idle time)이 길어지는 것이고 이는 비효율적이다. 그러니 여러 트랜잭션들을 동시에 수행해야 하는데, 이 때 동시에 수행되는 트랜잭션들이 데이터베이스에 미치는 영향은 순차적으로 수행했을 때 데이터베이스에 미치는 영향과 차이점이 없어야만 한다. 즉 데이터베이스에 저장된 데이터의 무결성은 .. 2019. 3. 3.
Quicksort from CTCI 코딩 인터뷰 완전 분석(원제: Cracking the Coding Interview)에 소개된 Quicksort를 다시 한 번 정리 해보려고 한다. 기본적으로 퀵정렬은, 무작위로 한 원소를 정하고(이를 pivot이라 부른다), pivot보다 작은 원소들은 앞쪽에, 큰 원소들은 뒷쪽에 위치시킨다. 실행시간: 평균 O(n logn), 최악 O(n^2).메모리: O(logn)배열 분할(partition)에 사용되는 원소(pivot)가 배열의 중간값(median) 혹은 중간값에 가까운 값이라면 좋은 성능이 나오겠지만, 반드시 그러리라는 보장은 할 수 없다. 즉 퀵정렬은 pivot을 어떻게 정하느냐에 따라 느리게 동작할 수도 있으며, 최악의 경우 수행시간이 O(n^2)이 될 수 있다. 이전에 작성했던 퀵정렬(Ho.. 2019. 3. 2.
GitHub 편리한 기능 3가지 1. Octotreerepository 내 디렉토리 구조를 한 눈에 볼 수 있는 Chrome extension이다. 왼쪽에 보이는 것처럼, 디렉토리 구조를 전체적으로 보면서 원하는 파일로 한 번에 들어갈 수 있다. Octotree 다운로드 링크 2. Repository에서 특정 파일 이름으로 찾기repository에 들어간 뒤, 't'를 누르면 파일 이름 검색화면이 뜬다. 3. 파일 history 한 눈에 보기특정 파일 페이지로 들어간 다음, url을 기존의 'https://github.com/~~~'에서 'https://github-history.netlify.com/~~~'과 같이 바꿔준다. 예를 들면,현재 URL) https://github.com/sourcegraph/sourcegraph이동할 U.. 2019. 2. 9.
JVM, JRE, 그리고 JDK의 개념 JVM - JVM (Java Virtual Machine)은 추상적인(abstract) 머신이다. 즉 JVM이 가상(virtual) 머신인 것은 그것이 물리적으로는 존재하지 않기 때문이다. - JVM은 Java 바이트코드가 실행될 수 있는 런타임 환경을 제공하는 명세(specification)다. (ex. HotSpot: JVM 구현체) - Java가 아닌 다른 언어(ex. Kotlin, Scala, Groovy 등)로 쓰여진 프로그램도 Java 바이트코드로 컴파일 되어 JVM이 실행할 수 있다. - JVM은 다양한 하드웨어와 소프트웨어 플랫폼에서 이용할 수 있다. JVM, JRE, JDK는 플랫폼 의존적인데, 각 OS의 설정이 서로 다르기 때문이다. 하지만 Java 언어 자체는 플랫폼 독립적이다. - .. 2019. 2. 4.
DFS(Depth-First Search; 깊이우선탐색) 그래프 탐색(Graph Search)이란?어떤 그래프에서, vertex s로부터 v까지의 path가 존재하는지 알아내는 것이다.ex) 특정 도시에서 한 도시로 갈 수 있는가? / 나와 특정 사람 간에 페이스북 친구들을 매개로 이어질 수 있는가? 등DFS(Depth-First Search; 깊이 우선 탐색)미로 찾기DFS에 대해 알아보기 전에, 여러 통행로(passage)와 교차로(intersection)들로 구성된 미로 속에서 길을 찾는 모습을 떠올려 보자. 미로에서 길 찾는 문제를 해결하는 방법으로 Tremaux exploration이라는 것이 있는데, 과정은 다음과 같다.▪︎ 아직 방문하지 않은 통행로 중 아무 곳이나 가본다. 처음으로 지나가는 통행로에는 길을 따라 선을 그어 놓는다.▪︎ 방문한 모든.. 2019. 1. 7.