💡 발단 기존에는 HTTP code(2xx, 3xx, 4xx)와 메세지로 서버의 응답을 표현하는 것이 무조건 옳다고 생각했다. 표준을 따른다면 웹 API에서는 이 방식을 따르는게 맞다. 그런데, HTTP의 40여개 코드로는 REST API의 모든 분기를 처리하기에 너무 적다. 예를 들면 권한 처리가 있다. 정지된 유저가 요청을 할 때와, 글쓴이가 아닌 유저의 글 삭제 요청에 대한 응답 코드는 모두 403(not Authorized) 이다. // 403 에러 { "message" : "banned user." } // 403 에러 { "message" : "not author of this content." } 문제는, 403으로 표현할 수 있는 가짓수가 너무 적다는거. 그래서 여러가지 분기를 표현하려면 ..
💡 발단 현재 프로젝트에선 기존에 로그인된 유저 정보를 불러오는 편의메소드를 제작하여 사용했다. (잠깐, SecurityContextHolder란) public class SecurityUtils { public static String getCurrentUserSocialEmail() { // 유저 정보를 불러오는 부분 Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); if (authentication == null || authentication.getName() == null) { throw new UserException(StatusCode.NOT_FOUND_USER); } // 유저 식별값..
💡 발단 현재 프로젝트에선 팀원이 Security 로직을 잘 구현해놨다. *카카오 연동 소셜 로그인(OAuth2.0)과 JWT 인증 방식을 사용한다. 그래서 난 내가 맡은 기능만 구현하면 되겠다고 생각했는데, Security의 구조를 모르니 문제가 생겼다. 로그인된 유저 객체를 ... 어떻게 가져오지? 분명 DB에서 조회해올텐데? 찾아보니 편의 메서드를 만들어서 쓰고 있었고, 난 이 함수를 불러와서 다른 로직을 구현할 수 있었다. public class UserService { // ... public User getCurrentUser() { // DB에서 유저 엔티티 조회 return userRepository.findBySocialEmail(getCurrentUserSocialEmail()).orE..
HTTP(Hypertext Transfer Protocol)란? HTTP는 인터넷에서 하이퍼텍스트를 교환하기 위한 통신 규약이다. 대표적으로 주고 받는 데이터 형태는 HTML이다. OSI 7계층중 응용계층에 속하는 프로토콜 TCP/IP 위에서 작동 Request와 Response로 통신 비연결지향(Connectionless) HTTP는 클라이언트가 요청(Request)을 서버에 보내고, 서버는 클라이언트에게 적절한 응답(Response)을 주고 연결(Connection)을 끊는 특성이 있다. 상태없음(Stateless) 커넥션을 끊는 순간 클라이언트와 서버의 통신이 끝나며 상태 정보는 유지하지 않는 특성이 있다. Method, Path, Version, Header, Body 등으로 구성됨 https:/..
우분투를 PC로써 쓰게 된 계기 2년전, 주변 분의 추천으로 듀얼 부팅(한 컴퓨터에서 여러 OS를 사용)을 하게 되면서 우분투를 가볍게 써보게 됐다. 지금 생각해보면 호기심이었다. 처음엔 꽤 불편했다. 전체적으로 디자인이나 UX 구조가 특이해서 적응할 시간이 필요했다. 그러나 필자의 성격상 컴퓨터의 디자인은 그리 중요하지 않았고, 개발에 필요한 소프트웨어를 하나씩 설치하면서 우분투에 손이 계속 가게 됐다. 놀란 사실은, 백엔드 개발에 필요한건 우분투로 모두 할 수 있었다. (안 될 줄 알았다) 6개월 정도 시범 운행(?)을 해보고, 결국... 난 컴퓨터를 우분투로 초기화했다. 이유는 단순했는데, 윈도우보다 우분투를 사용하는 시간이 훨씬 많아졌기 때문이다. 개인적으로 터미널을 조작하고 커스터마이징을 자유롭..
접근 제어자 (Public, Private, Protected) 접근제어자를 사용하는 이유는 객체지향 개념의 캡슐화의 맥락에서 이해되어야 한다. 즉 클래스 내부의 데이터를 외부로부터 보호하기 위해서이다. public : 접근 제한이 전혀 없음 protected : 다른 패키지의 자손 클래스에서 혹은 같은 패키지 내에서 접근 가능. 보통 상속을 통해 확장될 것으로 예상되는 멤버에다 씀. → 외부로부터는 접근 제한을 주되, 메서드의 경우엔 오버라이딩을 할 수 있게 되고 변수의 경우엔 (default) : 같은 패키지 내에서만 접근 가능. 한 파일 안에서 만드는 class 들이 default에 해당됨 private : 같은 클래스 내에서만 접근 가능 접근 범위로 나열했을 때 순서. public > protec..
객체지향이란? 분류(classification)란 특정한 객체를 특정한 개념의 객체 집합에 포함시키거나 포함시키지 않는 작업을 의미한다. 객체를 적절한 개념에 따라 분류한 애플리케이션은 유지보수가 용이하고 변경에 유연하게 대처할 수 있다. 더 중요한 것은 적절한 분류 체계는 애플리케이션을 다루는 개발자의 머릿속에 객체를 쉽게 찾고 조작할 수 있는 정신적인 지도를 제공한다는 것이다. - 객체지향의 사실과 오해 객체 지향 프로그래밍은 특정한 개념의 함수와 자료형을 함께 묶어서 관리하기 위해 탄생한 것이다. 즉 객체 내부에 자료형(필드)와 함수(메소드)가 같이 존재 한다. 현실 속의 객체와 소프트웨어 객체의 가장 큰 차이점은 무엇일까? 그것은 소프트웨어 객체가 자율적이고 능동적이라는 것이다. 객체지향 애플리케..
컴퓨터의 구성 컴퓨터 시스템은 기본적으로 하드웨어와 소프트웨어로 구성된다. 하드웨어 : 컴퓨터를 구성하는 기계적인 장치 중앙처리장치 (CPU) 기억장치 (RAM, HDD) 입출력 장치 : 마우스, 프린터, 스피커, 터치 스크린 등 소프트웨어 : 하드웨어의 동작을 지시하고 제어하는 명령어의 집합 시스템 소프트웨어 : 운영체제, 컴파일러 응용 소프트웨어 : 크롬, 스프레드 시트, 자바로 만든 서버, 게임 등등 위의 하드웨어 장치들은 모두 마더보드에 올라가거나 연결된다. 장치들은 모두 마더보드에 올라가거나 연결된다. 하드웨어는 중앙처리장치, 주기억장치와 보조기억장치, 입출력장치로 구성되며 각 장치는 시스템 버스(데이터와 명령 제어 신호를 각 장치로 전달하는 역할)로 연결되어 있다. 중앙처리장치(CPU, 마이크..
해시 테이블이란? 여러가지 물건들이 있는데, 이걸 일렬로 세워놓지 말고 바구니 몇개 만들어서 바구니 A, 바구니 B, …에 넣어두자는거다. key, value 쌍으로 자료를 저장하는 자료구조중 하나. key → 해시값 → index 해시 함수를 사용하여 key를 해시값으로 매핑하고, 이 해시값을 index 혹은 주소 삼아 데이터의 값(value)을 키와 함께 저장하고 검색하는 자료구조. 해시 함수(hash function)란, 데이터의 효율적 관리를 목적으로 임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하는 함수. 이 때 매핑 전 원래 데이터의 값을 키(key), 매핑 후 데이터의 값을 해시값(hash value), 매핑하는 과정 자체를 해싱(hashing)이라고 한다. 시간 복잡도 O(1) ~ O..
트랜잭션(transaction)이란? 한 묶음으로 처리되도록 만든 SQL 명령문들을 묶은 작업 단위 대부분의 의미 있는 서비스 처리를 하려면 SQL 명령문 한번 (SELECT, UPDATE, …)만으로는 어렵다. 계좌이체라는 작업을 예시로 들어보자. 만약 X의 돈을 100 감소시키는 UPDATE 문 직후에 서버가 다운되면 어떻게 될까? 더 이상 서버에선 쿼리문을 날리지 못하니, Y에겐 100만큼의 돈이 가지 않고 회사가 X의 돈을 훔친 꼴이 된다(!). 그리고 갑작스러운 서버 다운, 네트워크 오류, 데이터센터 화재 등 데이터베이스의 일관성을 위협하는 요소들은 생각보다 많다. 이를 해결하기 위해선 계좌이체라는 하나의 처리를 { X 잔고 UPDATE 문, Y 잔고 UPDATE 문 } 한 단위로 묶어서 모두 ..