목록분류 전체보기 (89)
빠에야는 개발중
왜 비교하는가? 나는 git을 사용하긴 하지만 git 커맨드를 기본적인것 외에는 잘 모른다. 처음 git을 접할 때부터 좋은 클라이언트를 함께 가져갔기 때문인데, 그것이 atlassian의 sourcetree이다. 깔끔한 인터페이스와 마우스 클릭 몇번이면 커밋, 푸시, 풀이 쉽게 되었고 특히 cli의 그것과는 전혀 다른 예쁘장한 그래프까지… 안 쓸 이유가 없었다. 그렇게 몇 년 간을 써오던 sourcetree인데 최근 들어 문제가 조금씩 나타났다. 다루는 프로젝트의 크기가 점차 커져가서 그런건지 sourcetree로 코드를 확인할 때 조금씩 버벅임이 발생했다. 특히 스태시처럼 한꺼번에 많은 내용들을 볼 때는 마우스 커서마저 느리가 만드는 위엄을 보여주었다.. 지금 쓰는 컴퓨터 내부의 문제일 수도 있지만(..
왜 두 책을 같이 리뷰하는가? “실용주의 프로그래머”라고 하면 두말할 것 없이 유명한 책이다. 개발자들의 필독서처럼 여겨지고 있고, 나도 그래서 구매해서 읽게 되었다. 그렇게 유명한 책을 저술한 저자 앤드류 헌트, 데이비트 토머스 씨에게는 죄송하지만 나는 연달아 읽은 책 “실용주의 디버깅”에서 두 책간의 연결고리 비슷한 무언가를 느꼈다. 그렇기에 두 책이 가르쳐준 방법적인 교훈도 유용했지만 독서 전반적으로 느꼈던 그 느낌적인 것들을 이 글에서는 적으려고 한다. 좀 더 자세한 기술적 부분들은 나중에 기록할 기회가 있을 것이라 믿는다. 실용주의는 경험주의다 실용이라는 말을 풀어쓰면 실제로 사용한다는 의미다. 직접 해보는 것, 그리고 거기서 얻어지는 것들을 우선으로 삼는다는 것이고 이는 결국 경험이라고 일축할..
오랜만에 글을 쓴다. 전부터 궁금했던 redis에 대해서 알아보자.2015년에 ndc에서 들었던 세션 중에 마비노기 TCG 게임에서 redis를 사용하여 캐싱을 한다는 이야기를 들은 기억이 있다. 그 때 이름만 듣고 넘어갔던 녀석이 점점 많이 들리기 시작했고 최근에는 H2 데이터베이스를 사용해보면서 “인 메모리 데이터베이스”의 개념을 알게 되었고 결국 대중적 오픈 소스인 redis에 도달하게 되었다. 그럼 이것들이 다 무엇인가? In-memory Database 인메모리 데이터베이스는 디스크가 아닌 메모리에 데이터들을 저장하는 방식의 데이터베이스를 일컫는다. 처리 속도가 디스크에 비해 월등히 빠른 메모리 레벨에서 데이터를 처리함으로써 성능 향상을 도모한 것이다. 그런데 메모리에 데이터를 저장한다는 건 시..
단순 연결리스트에 대한 개념이 부족해서 전에는 풀지 못했던 문제였고, 공부를 해보았다. 한쪽 방향으로만 연결되어있다는 특징을 최대한 활용해야하는 문제이다. 일반적인 배열이나 ArrayList라면 인덱스로 간단하게 바꿀 수 있다. 이중 연결리스트도 오버헤드가 좀 들지만 비교적 간단하게 가능하다. 하지만 단순 연결리스트는 생각을 좀 해야하는데, 처음에 생각했던 방법은 모든 요소를 스택에 집어넣어서 하나씩 빼며 리스트를 새로 생성하는 것이었다. 하지만 이 방법은 리스트의 크기만큼의 메모리가 필요하기 때문에 규모가 커지면 효율적이지 못하다. 시간적으로도 선형 탐색을 두번해야한다는 점에서 그 단점을 알 수 있다. 그래서 추가메모리를 최대한 줄이고 탐색 시간도 줄이기 위해서는 다음과 같이 하면 된다. 핵심은 새로운..
어떤 클래스의 객체를 생성하여 초기화를 해주고 싶다.1234567891011121314151617181920212223242526272829303132333435363738394041public class PersonInfo { private String name; private Integer age; private String favoriteColor; private String favoriteAnimal; private Integer favoriteNumber; public PersonInfo(String name, Integer age, String favoriteColor, String favoriteAnimal, Integer favoriteNumber){ this.name = name; thi..
똑같이 http가 들어간 이름들이지만 그 목적은 다르다고 할 수 있다. 그렇다면 서로 다른 두 가지의 주제를 왜 한 게시물에 쓰느냐… 그건 http/2가 https를 보조하는 역할을 어느 정도 해주기 때문이다. 결코 https 내용이 짧아서 그런게 아니다.(강조) https https는 http의 취약한 보안을 극복하기 위하여 등장한 프로토콜이다. 간단히 말해서 데이터를 암호화 하자는 것인데, 기존의 http는 통신 정보(메소드, url, 버전 등)를 모두 평문으로 주고 받는다. 그렇기 때문에 해킹에 매우 매우 취약하다고 할 수 있다. 이것을 SSL/TLS 프로토콜로 암호화 해줌으로써 향상된 보안을 꾀하는 것이 https이다. 당장에 s의 뜻이 secure에서 오는 것만 봐도 알 수 있다. https는 ..
SSL 인증서는 클라이언트-서버 간 안전한 통신을 위해 사용 되는 기술이다. 그 맥락은 전자 서명과 비슷한데, 몇 가지 개념이 추가적으로 들어간다. 공개키와 대칭키 암호화/복호화의 방법에는 공개키(비대칭키) 방식과 대칭키 방식이 있다. 공개키 방식은 암호화, 복호화 하는 키가 서로 다르기 때문에 중간 과정에서의 탈취의 염려가 적다. 그래서 일반적인 전자 서명에서 많이 사용되는 기법이다. 반면에 대칭키는 하나의 키로 암호화와 복호화를 모두 처리한다. 그렇기 때문에 중간에 키가 탈취되면 안전성이 전혀 없어진다. 두 가지를 모두 사용하자 이렇게만 보면 공개키를 사용하지 대칭키를 왜 사용하냐 하겠지만 공개키에는 사실 큰 단점이 있었으니 그것은 바로 성능이다. 서로 다른 키로 암호화와 복호화를 하는 만큼 처리 시..
목적 http는 connectionless하고 stateless한 프로토콜이다. 매 요청마다 연결을 맺고 끊으며 클라이언트와 서버 간의 상태를 공유하지 않는다. 하지만 이런 http의 특징은 사용성에 있어서 불편함을 초래하는데, 예를 들어 쇼핑몰 따위의 장바구니 서비스는 상태 유지가 안되면 존재 자체가 불가능하다. 그렇기 때문에 서로의 연결을 유지하는 장치가 필요한데, 그것이 쿠키와 세션이다. 그렇다면 둘은 어떤 차이가 있을까? 쿠키 쿠키는 클라이언트, 즉 브라우저에 파일 형태로 정보를 저장하는 방법이다. 이름의 유래는 헨젤과 그레텔 동화에서 집을 찾기 위해 뿌렸던 쿠키에서 가져왔다.(결국 다 먹혀버리지만) 브라우저는 최초에 서버와의 연결이 성공하면 상태 정보를 쿠키로 저장하고 다음 요청부터 reques..
String 일반적으로 자주 사용되는 String은 불변 객체로서 그 내용이 바뀌지 않고 +, concat 등 문자열 연결을 하게 되면 새로운 객체를 생성하여 연결된 문자열을 할당하고 기존 문자열은 가비지 컬렉터에 의해 회수된다. 그렇기 때문에 여러 입력을 받았을 때 성능 이유가 발생한다. StringBuffer, StringBuilder StringBuffer와 StringBuilder는 불변 객체인 String의 한계를 극복하기 위해 등장한 가변 객체이다. 즉 문자열을 추가하면 기존 객체에 버퍼 크기를 늘려 문자열을 더하는 연산만 하는 것이다. 이로써 성능 이슈를 해결할 수 있게 된다. 그렇다면 두 클래스의 차이는 무엇일까? 그것은 “동기화 여부”이다. StringBuffer는 synchronized..
abstract class(이하 추상 클래스)와 interface(이하 인터페이스)는 하위 클래스(정확히는 다르다.)가 미리 선언된 메소드를 오버라이딩 해서 사용할 수 있도록 하는 도구라는 공통점이 있다. 하지만 이 둘은 차이점이 존재한다. 오히려 차이점이 없으면 두 가지가 존재할 이유가 없다. 그 이유를 외적인 차이와 내적인 차이로 알아보자. 외적인 차이 추상 클래스는 추상 메소드 이외에도 일반 메소드를 선언하고 정의할 수 있다. 그리고 하위 클래스에서 이 클래스를 상속(extends)하여 추상 메소드를 오버라이딩 하여 사용할 수 있다. 반면 인터페이스는 일반 메소드를 정의할 수 없고, 하위 클래스가 인터페이스를 구현(implements)해서 오버라이딩을 통한 메소드 정의를 한다. 인터페이스에서는 메소..