개요 스프링 프레임워크가 처음 출시되었을 때는 의존성 버전을 직접 관리하거나, 서버를 직접 설치해주어야 하는 등의 초기 설정을 직접 해주어야 했다. 이를 보완하기 위해서 스프링 부트가 출시되었는데, 이것은 최소한의 설정으로 스프링 기반의 애플리케이션을 독립 실행할 수 있게 돕는 프레임워크라고 할 수 있다. 우리는 스프링 부트를 통해 1. starter 패키지를 통해 필요한 의존성을 자동으로 가져올 수 있게 되었을 뿐 아니라,2.기존에는 @ComponentScan, @EnableAutoConfiguration, @Configuration을 통해서 명시적으로 설정해주어야 했던 반면, @SpringBootApplication을 통해서 이 셋 대신 자동으로 필요한 빈을 설정해줄 수 있게 되었다.3. 또한, 내..
개요 사용자의 인증이 필요한 웹 사이트마다 로그인 기능을 필요로 한다면 민감한 정보에 대한 관리가 필요해지기 때문에 번거로울 수 있고, 보안에 취약해질 수 있다. 따라서 google이나 naver, kakao같은 외부 소셜 서비스를 기반으로 회원가입/로그인 할 수 있는 기능을 많이들 사용하고는 하는데, 이를 위해 접근 권한을 위임받은 것을 OAuth라고 한다. OAuth를 사용하지 않고 소셜 서비스에 인증을 위임하기 위해서는 사용자는 소셜 서비스의 인증을 위한 수단을 서버에 위임해야 했다. 이는 소셜 서비스 외부로 ID/PW(인증)가 노출되게 되는 문제가 있다. 이렇게 서버가 사용자의 인증을 필요로 하는 이유는 소셜 서비스로의 인가를 필요로 하는 것이 목적이므로, 인증은 사용자에 직접 위임하고, 인가는..
1. 에러(Error)와 예외(Exception) 일반적으로 자바에서는 잡을 필요도 없고, 회복또한 불가능한 것을 에러(Error)라고 하며, 잡을 수 있고 회복이 가능한 것을 예외(Exception)이라고 부른다. 위 그림에서 나타나는 에러들을 보면 쉽게 이해할 수 있을 것이다. 예를 들어 OutOfMemoryError라는 에러는’ 메모리 부족’이라는 예상할 수 없고, 프로그램상으로 해결할 수도 없는 문제를 나타내고 있다. 아마 자연스럽게 느껴질텐데, 이러한 이유로 프로그램을 짤 때 주로 개발자는 에러보다는 예외에 대해서 고려하게 된다. 2. 예외(Exception)의 종류 자바에서 모든 예외도 객체이므로 Object를 상속받으며, 최상위 예외로는 Throwable클래스를 갖는다. Throwa..
트랜잭션 트랜잭션이란 데이터베이스에서 하나의 공통된 목적을 위한 작업을 의미한다. 예를 들면, A에서 B로의 '송금'이라는 거래를 위해서는 A의 잔고에서 임의의 금액을 빼고, B의 잔고에 임의의 금액만큼을 더해주는 2가지 일이 한 가지 일처럼 실행되어야 한다. 두가지 일 중에서 하나의 작업이라도 누락된다면 문제가 발생할 수 있는데, 트랜잭션은 모든 하위 작업을 묶어서 모두 실행되거나, 모두 실행되지 않도록 만든다. 만약에 모든 작업이 성공하여 DB에 변화가 반영되었다면 해당 작업이 커밋(commit)되었다고 하고, 하나라도 실패해서 작업 이전으로 되돌아가는 것을 롤백(rollback)이라고 한다. 트랜잭션의 성질 트랜잭션은 ACID로 불리는 4가지 대표적인 성질을 갖는데, 각각 원자성, 일관성, 고립..
골드 5인데도 하루를 꼬박 썼다. 직전에 유사한 문제 (BOJ 14502 연구소 - https://www.acmicpc.net/problem/14502)를 풀어서 조합을 이용한 풀이를 빨리 떠올렸고, 하다못해 구글링해서 아주 유사한 코드를 발견했음에도 어디가 문제인지 몰라서 한참을 헤맨 문제. (난 알고리즘 팔생각도 없고 코테합만 안정적으로 할 딱 그정도 수준만 되고싶을 뿐인데 참 어렵다.) 문제 정리 간단하게 정리하면, "NxN 크기의 도시에 집들과 치킨집들이 있다. 이 치킨집들의 숫자를 M개까지 줄일 때, '치킨 거리'의 합의 최소값을 구하시오. (치킨 거리란, 임의의 집에서 치킨집까지 거리의 최소값을 의미한다.)"로 정리할 수 있다. 풀이 처음에는 NxN의 인접 행렬로 도시를 표현하고 나서, 처음 ..
람다란 익명 함수(이름이 없는 함수)를 말하는데, 자바에서의 람다식 표현법과 활용되는 예를 정리했다. 람다식 람다식은 이름이 없는 함수를 의미하는데, 즉 함수를 하나의 식으로 표현하는 방법이다. 가장 간단한 람다식은 다음과 같이 표현할 수 있다. 이때 expression은 바로 return값이 나와야 한다. 예를 들면 public String getName() { return "name"; } () -> "name" 과 같이 바로 리턴값이 나와야 한다. 만약 다양한 변수나 선언문, 배정문등을 쓰기 위해서는 중괄호를 사용해주면 된다. 이러한 람다식은 불필요한 코드를 줄이고, 가독성을 높이기 위해서 사용될 수 있다. 함수형 인터페이스 배열을 정렬하는 Arrays.sort() 함수에서 사용되는 예를 보자. I..
애플리케이션 서비스를 개발할 때 데이터는 DB에 보관하고, DB와의 연결을 위해서 애플리케이션(클라이언트)은 애플리케이션 서버를 이용하여 DB와의 연결을 구축했다. 이 연결은 구축된 커넥션을 통해서 sql을 전달하면 db에서 결과를 응답받는 식으로 진행되었는데, 문제는 DB의 종류마다 이 커넥션의 방법이 달라서 DB를 변경하면 애플리케이션 서버의 DB관련 코드도 변경해주어야 했다는 것이다. 이러한 불편함을 해소하기 위해서 JDBC라는 자바 커넥션 표준이 등장하게 된다. JPA의 구현체인 hibernate도 내부적으로 이러한 JDBC를 사용하여 DB와 통신한다. JDBC (Java DB Connectivity) JDBC는 자바에서 데이터베이스에 접근하기 위한 API들을 제공하는 라이브러리로, 연결-SQL ..
https://www.acmicpc.net/problem/16236 16236번: 아기 상어 N×N 크기의 공간에 물고기 M마리와 아기 상어 1마리가 있다. 공간은 1×1 크기의 정사각형 칸으로 나누어져 있다. 한 칸에는 물고기가 최대 1마리 존재한다. 아기 상어와 물고기는 모두 크기를 가 www.acmicpc.net 풀이시간 모두 합치면 6~7시간도 넘게 걸린 문제다.ㅜ 풀이과정을 떠올리는데에는 그렇게까지 많은 시간이 걸리지는 않았지만 탐색 문제를 풀때마다 막상 세부 구현에서 문제가 생겨서 정리해놓기 위해 쓴다. 1. 문제 파악 항상 그렇지만 문제가 길수록 문제의 조건을 읽기X 이해O한 후에 본격적으로 코드를 작성하자. 이 문제를 읽고 정리할 점은 다음과 같다. - 상어는 자신의 크기보다 작은 크기의 ..
플로이드 알고리즘 플로이드 알고리즘은 시간복잡도 조건에 여유가 있는경우(O^3) 사용할 수 있는 알고리즘으로, 한 시작점에서 다른 정점까지의 최단 거리를 구하는 다익스트라 알고리즘과 다르게 모든 정점 쌍에 대해서 둘 사이의 최단 거리를 구하는 알고리즘이다. 위 가중치 그래프에서, A에서 E로 가기 위한 방법은 (1) A에서 E로 직접 가는 방법과, (2) 중간에 C를 거져가는 방법 총 2가지 방법이 존재한다. 따라서 두 정점 쌍의 최단 거리를 구하기 위해서는 두 정점 사이에 존재하는 경유점을 거쳐가는 방법들을 탐색하며 그 방법들 중에 최소값을 구하면 된다. len[A][E] = Min(len[A][E], len[A][C] + len[C][E]) N개의 노드에 대한 플로이드 알고리즘은 O(N^3)의 시간복..
0. String ★★★★★import java.io.*;//BufferedReader, BufferedWriterBufferedReader br = new BufferedReader(new InputStreamReader(System.in));BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));String[] strArray = br.readLine().split("");bw.write(1+"\n");bw.flush();bw.close();가장 먼저 입출력을 위해서 BufferedReader와 BufferedWriter를 사용할 수 있다. BOJ에서는 필수지만 실제 코테에서는 잘 사용하지 않음. //StringString..
개요 CI/CD (Continuous Integration/Continuous Delivery, Continuous Deployment)란 애플리케이션 개발 단계를 자동화하여 애플리케이션을 짧은 주기로 고객에게 제공하는 절차를 말한다. 그 과정에서 코드를 병합하고 build/test하고 서버로 옮기는 과정이 반복되게 되는데, 이러한 반복 작업을 줄이는 것이 CI/CD이다. CI: 지속적인 통합 CI는 애플리케이션 코드의 변경을 정기적으로 build/test하는 과정을 자동화한 것을 말한다. 즉 애플리케이션 코드의 새로운 변경사항이 자동으로 공유 리포지토리에 병합된다.1. 개발자가 구현한 코드를 기존 코드와 병합한다.2. 병합된 코드가 올바르게 동작하고 빌드되는지 검증한다.3. 검증 결과 문제가 있..
개요 스프링을 사용할때 기본적으로 JPARespository를 이용하여 DB에 대한 쿼리 메소드 기능을 사용하게 된다. 하지만 기본적인 CRUD기능이 아니라 더 복잡한 쿼리문을 작성하기 위해서는 네이티브 쿼리를 작성하거나, jpql을 사용해야 했다. https://eckrin.tistory.com/37 [JPA] 객체지향 쿼리 언어(JPQL) 0. 소개 DB에 접근하기 위해서는 기본적으로 쿼리문이 실행되어야 한다. jpa를 이용하면 기본적인 SQL문이 자동으로 나가게 되긴 하지만, 직접 쿼리문을 작성하여 쿼리를 보내야 할 때를 위해 SQL을 eckrin.tistory.com 하지만 jpql을 작성할 경우, 쿼리문이 복잡해질수록 쿼리 스트링이 길어지게 되고, jpql 문자열 자체에 오타 혹은 문법적인 오류..