본문 바로가기

전체 글984

JSR 303, 380, @Valid, @Validated 보호되어 있는 글 입니다. 2023. 7. 23.
외부 API를 사용하는 테스트 코드 개발을 하다 보면 외부 서버의 API를 이용하는 경우가 매우 많다. 혹은 외부 라이브러리를 테스트해야 하는 일도 생긴다. 현재 나는 회원 인증을 위한 코드를 작성하는데, 해당 테스트 코드를 어떻게 작성해야 하는지 고민 중이다. 첫 번째 고민은 다음과 같다. 테스트 코드를 실행함에 있어 실제 외부 API 호출을 진행할 수 없다. 비용적인 문제와 테스트 코드의 검증 시간적인 문제가 발생한다. private val vonageClient: VonageClient fun verify(verifyRequest: VerifyReq): VonageVerifyResult { runCatching { vonageClient.verifyClient.verify(createVerifyRequest(verifyRequest).. 2023. 7. 19.
Scope functions Kotlin 표준 라이브러리에는 객체의 컨텍스트 내에서 코드 블록을 실행하는 것이 유일한 목적인 여러 함수가 포함되어 있습니다. let, run, with, apply and also와 같은 함수는 모두 객체에서 코드 블록을 실행하는 동일한 작업을 수행하는데요. 각 함수의 차이점은 블록 내에서 이 객체를 사용할 수 있게 되는 방식과 표현식의 결과입니다. 몇 가지의 유형 별 예제를 통해 어떻게 scope function을 사용하는지 알아봅니다. Person("Alice", 20, "Amsterdam").let { println(it) it.moveTo("London") it.incrementAge() println(it) } 만약 동일한 코드를 let 키워드 없이 사용한다면 새로운 변수를 선언하고, 반복해.. 2023. 7. 15.
lambda in computer programming 우선 우리는 표현식과 구문을 구분할 줄 알아야 한다. 구문(statement)은 이름에서 나타난다. 반복문, 조건문, 분기문, 선언문 등등 프로그램의 흐름 제어나 구조를 생성할 때 사용되는 문법이다. 표현식(expression) if, while, for문에서 사용되는 조건식이 있다. 이는 표현식이다. 이는 값으로 실행 시점에 값으로 표현되어 참 혹은 거짓의 값을 나타낸다. 이를 이해하면 프로그래밍 언어가 발전됨에 따라 늘어나는 간소화된 문법을 이해하는데 큰 도움이 된다. 이제 Wikipedia에서 lamba, Anonymous function을 검색해 보자. In computer programming, an anonymous function (function literal, lambda abstract.. 2023. 7. 14.
Vonage Verify API https://github.com/sungil-yu/essentory GitHub - sungil-yu/essentory: 회원 가입 프로세스 중 휴대폰 인증. 회원 가입 프로세스 중 휴대폰 인증. Contribute to sungil-yu/essentory development by creating an account on GitHub. github.com 외부 라이브러리를 사용함에 따라 익셉션 처리에 대해 고민이 많았다. 이제 테스트 코드를 작성해야하는데, mock, spy 주제로 공부하면서 작성해야 겠다. 추가적으로 코틀린의 문법을 공식문서에서 한 번 더 봐야겠다. 가독성이 좋지 않아보이는데, 리팩토링도 계속해야겠다. 2023. 7. 14.
Naver Code Convention Naver Code Convention을 적용하려고 한다. https://github.com/naver/hackday-conventions-java GitHub - naver/hackday-conventions-java: 캠퍼스 핵데이 Java 코딩 컨벤션 캠퍼스 핵데이 Java 코딩 컨벤션. Contribute to naver/hackday-conventions-java development by creating an account on GitHub. github.com 다음 링크에서 다음 섹션을 확인한다. .editorconfig 설정 Naver 코드 컨벤션 설정으로 해당 파일을 프로젝트 루트 경로에 생성한 후 소스코드를 소스 코드 저장소에 같이 커밋한다. https://naver.github.io/.. 2023. 7. 12.
🛠️ Swagger ? API 문서에 대해 고민한 적이 있다. 이유는 API 문서를 노션에 관리해서 소비자에게 전달했는데, 정말 귀찮은 프로세스였다. 개발 - 테스트 - API Notion 최신화 - 수정 - 개발 - 테스트 - API Notion 최신화 아니 다른 방법이 있다. 찾고 적용하자라는 마인드로 REST Docs 찾아서, 적용한 적이 있다. 이때 고생 아닌 고생을 해야 했는데, 우선 모든 API에 대해 테스트 코드를 다시 작성했다. UI를 위해 Asciidoctor인가? 문법을 보면서 template를 작성했다. 설정도 복잡했고, 가장 중요한 건 코드 작업량이 미쳤다는 것이다. 테스트 코드도 유지보수의 작업인데, 이게 혼자 백엔드를 개발하는데 감당이 안된다. 같이하면 뭐.. 그래도 마무리했다.. 이번 팀프로젝트에서 .. 2023. 7. 12.
코딩 테스트, 코드 리뷰, 인터뷰 피할 수 없으면 즐겨 보호되어 있는 글 입니다. 2023. 7. 12.
스크럼이 뭐야? 어느 개발 조직은 스크럼을 매일 진행한다고 한다. 스크럼이 뭘까? 애자일 소프트웨어 개발 방법론 중 하나인 스크럼을 말하는 것일까? 방법론적인 입장에서 생각해 보면 스크럼은 팀 기반의 프로젝트 관리 접근 방식이라고 한다. 스크럼은 개발 프로세스를 반복적이고 적응적으로 진행하는 데 초점을 두며, 복잡한 문제를 해결하기 위한 효과적인 방법을 제시한다고 한다. 소비자의 의견을 반영하여 빠른 배포를 위한 하나의 개발 방법론인가요? 스크럼은 다음과 같은 구성 요소로 이루어져 있다고 합니다. 1. Product Backlog 개발해야 할 모든 작업 항목을 우선순위에 따라 나열한 목록입니다. 제품의 백로그는 제품의 요구 사항과 기능을 기술해야 합니다. 음. 이번 팀프로젝트에서 진행되어야할 리스트업이 있다고 했는데, .. 2023. 7. 12.
R&R R&R은 Role and Responsibility의 약자로, 직무와 책임을 의미한다. 서버개발 Unit의 R&R은 다음과 같이 구분된다. 서버개발 엔지니어 서버 시스템의 설계, 개발, 운영을 담당합니다. 서버 시스템의 성능, 보안, 안정성을 확보합니다. 서버 시스템의 신규 기능 개발 및 유지 보수를 수행합니다. 실제 개발 업무는 회사마다 상이하다. 예를 들면 웹 백엔드인 경우 Service API, CMS API, DataBase, BackEnd 개발이 있다. Service API는 서비스의 기능 및 데이터를 제공하는 기능 개발이며, CMS API는 서비스에 사용되는 콘텐츠를 관리하기 위한 admin 전용 API 개발이다. 이에 따른 Database 역량이 요구되며, BackEnd 개발은 서버 아키텍처.. 2023. 7. 12.
Records JEP 395에는 레코드를 다음과 같이 요약했습니다. Enhance the Java programming language with records, which are classes that act as transparent carriers for immutable data. Records can be thought of as nominal tuples. 자바 14, 15 preview에서 2021년 3월 16일 JDK 16에 General Availabilty에 도달하면서 Java 레코드는 공식적으로 언어의 일부가 된 Records는 불변 데이터 객체를 매우 쉽게 정의할 수 있는 새로운 형태의 클래스이며 데이터를 저장하고, 접근하기 위한 필드와 해당 필드에 대한 접근자 메서드를 자동으로 생성해 줍니다. 2.. 2023. 7. 11.
2023-07-11 issue & settings Bitbuckets의 패키지 구조 Commit 패키지 생성 필요, 현재 작업 중인 코드를 commit된 패키지에 맞춰 재 작업 RDS connection 불가 AWS 보안 그룹 Inbound 규칙 추가하여 해결 Swagger (API 문서 도구) Swagger Settings & Use guide 확인. Swagger rest docs의 변환이 자유롭기 때문에, 실무에서 사용중인 swagger 사용. https://swagger.io/ API Documentation & Design Tools for Teams | Swagger Loved by all • Big & Small Thousands of teams worldwide trust Swagger to deliver better products, f.. 2023. 7. 11.
ZGC (HotSpot) 보호되어 있는 글 입니다. 2023. 7. 11.
4375 문제 요약 2와 5로 나누어 떨어지지 않는 정수 n, 각 자릿수가 모두 1로만 이루어진 n의 배수를 찾아라. 출력 각 자릿수가 모두 1로만 이루어진 n의 배수 중 가장 작은 수의 자리수를 출력한다. 문제 풀이 뭔소리야? 배수는 어떤 수를 다른 수로 나누었을 때 나누어 떨어지는 수를 말한다. 다른 말로는 한 수를 다른 수로 곱하여 얻어진 수를 해당 수의 배수라고 한다. 3, 6, 9는 뭐야? 3의 배수. 왜? 3,6,9라는 수를 3으로 나누었을 때 나누어 떨어지니까. 역으로 3 * 1 =3, 3 * 2= 6, 3*3=9, 얻어진 수는 3,6,9이고 이는 3의 배수. 이 개념으로 들어가면 각 자릿수가 1로만 이루어진 경우는 다음과 같다. 1 11 111 1111 11111 이를 n으로 나눈 결과가 0인 경우.. 2023. 7. 9.
1629 문제 요약 자연수 A를 B번 곱한 수를 알고 싶고, 이를 C로 나눈 나머지를 구해라. 입력 A, B, C 모두 2,147,483,647 이하의 자연수이다. 풀이 시간제한이 0.5초이다. 21억 번 반복하면서 곱하면 시간 초과가 발생한다. 또한 이 값이 long long 범위를 넘어서기 때문에 중간중간 나머지를 구해야 하고, 계산값을 중간에 캐싱해야한다. #include using namespace std; int r,a,b,c; long long powMod(int a, int b, int c){ if(b == 0) { return 1; } long long temp = powMod(a, b/2, c) % c; long long result = (temp * temp) % c; if(b & 1){ res.. 2023. 7. 9.
3986 문제 요약 A, B로 이루어진 단어를 이차형 곡선을 그어 쌍을 지어지면 좋은 단어이며, 이 개수를 센다. 입력 N개의 단어수 ( 100이하의 자연수) N개의 줄에 A와 B로 이루어진 단어가 한 줄에 하나씩 주어지며, 길이는 2와 100,000 사이이며, 모든 단어 길이의 합은 1,000,000을 넘지 않음. 출력 좋은 단어의 수 출력 풀이 stack 자료구조 문제로 문자열을 하나씩 입력받고 stack의 top 값이 들어온 입력과 같으면 top값을 pop 시키고, 그렇지 않으면 push 한다. 단어 반복마다 최종적으로 stack이 비어있으면 좋은 단어의 카운트를 1 증가시킨다. #include using namespace std; int n, cnt; string str; int main() { ios_b.. 2023. 7. 9.
1940 문제 요약 갑옷은 두 개의 재료로 만들어진다. 두 재료의 고유한 번호를 합쳐서 M이 되면 갑옷이 만들어진다. 입력 N개의 재료( 1 m; for (int i = 0; i > te[i]; if(m > 200000) cout 2023. 7. 9.
1213 문제 요약 들어온 문자열을 분해하여 팰린드롬을 만들어야 한다. 입력 알파벳 대분자의 최대 50글자. 출력 만든 팰린드롬 출력, 불가능할 때는 정해진 문자열 출력 정답이 여러 개일 경우에는 사전순으로 앞서는 것을 출력 풀이 각 문자의 숫자를 세서 저장한다. 홀수가 2개 이상이면 팰린드롬을 만들 수 없다. 이제 만드는 것이 문제인데.. 다음과 같이 정의해 보자. 1. 이름을 입력받는다. 2. count 배열을 생성하여 들어온 문자열의 개수를 저장한다. 3. 오름차순으로 표현해야 하기 때문에 Z부터 반복한다. 4. 카운트가 존재하는 경우 4.1 홀수인지를 판단한다. 홀수라면 해당 문자열을 변수에 저장하고 카운트 값을 감소시킨다. 4.2 만약 홀수가 두 개이상인 경우 반복을 중단하고 불가능 출력을 진행한다. 이.. 2023. 7. 9.
Kotlin, Querydsl 설정 목표 Spring Boot, kotlin, Gradle 7.x.x 환경에서 Querydsl을 사용하기 위한 설정을 진행한다. * tip : 프로젝트의 gradle 버전은 project_root/gradle/wrapper/gradle-wrapper.properties에서 확인 가능하다 1. build.gradle Plugins 추가 plugins { id 'org.springframework.boot' version '2.6.8' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java' id 'org.jetbrains.kotlin.jvm' version '1.8.22' id 'org.jetbrains.kotlin.plugin.jpa' .. 2023. 7. 8.
9375 문제 요약 패션에 매우 민감하다. 한번 입었던 옷들의 조합을 다시 입지 않는 친구가 있다. 이 친구의 의상이 주어졌을 때 친구가 알몸이 아닌 상태로 며칠 동안 밖에 돌아다닐 수 있을까? 입력 친구가 가진 의상의 수 n이 주어진다. ( 0 tc; while(tc--){ map _map; cin >> n; for(int i=0; i > a >> b; _map[b]++; } long long ret = 1; for(auto a: _map){ ret *= ((long long) a.second + 1); } ret--; cout 2023. 7. 8.
Hibernate Architecture 하이버네이트의 설계 목적은 SQL 및 JDBC를 사용하여 수작업으로 데이터를 처리할 필요가 없도록 함으로써 개발자가 일반적인 데이터 지속성 관련 프로그래밍 작업의 95%에서 벗어날 수 있도록 하는 것이다. 타 지속성 솔루션들과 달리 하이버네이트는 SQL에 대한 강력한 기술을 사용할 수 있게 하며, 관계형 기술에 대한 지식과 투자를 항상 가치 있도록 보장하려고 노력한다. 사실 하이버네이트는 비지니스비즈니스 로직을 구현하기 위해 stored-procedures만 사용하는 데이터 중심 애플리케이션에는 적합하지 않을 수 있습니다. 그러나 Java 기반의 middle-tier의 객체지향 도메인 모델 및 비즈니스 로직에 가장 유용하다고 할 수 있습니다. 여기서 Middle-tier는 소프트웨어 아키텍처에서 사용되는.. 2023. 7. 8.
@Converter, Enum Enum은 열거형이라고 불리는 데이터 유형입니다. 고정된 상수 집합을 하나의 클래스처럼 다룰 수 있기에 빈번하게 사용됩니다. JPA는 enum을 지원하며 데이터베이스에 열거형 상수를 저장하고 조회할 수 있도록 지원합니다. 일반적으로 JPA에서 enum을 매핑하기 위해 @Enumerated 애노테이션을 사용하여 매핑합니다. 혹은 @Converter를 활용합니다. Java @Entity public class Book { // ... @Enumerated(EnumType.STRING) private BookType type; // ... } Kotlin @Entity class Book constructor( ... @Convert(converter = BookTypeConvertor::class) val .. 2023. 7. 7.
회원가입 시 본인 인증 Vendor 특징 회원가입 이후 본인 인증을 진행하기 위해선 다양한 방법이 있다. 그중 휴대폰 인증과 실제 본인 확인 인증으로 나누어지는 것 같다. 각 목적에 따라 특정 벤더 사를 이용하게 되는데 고려대상의 vendor에 대해 조금 정리하였다. Vendor 종류 별 특징 Vonage 국제 서비스로 SMS, 음성 기반 문자 인증 서비스 등 다양한 서비스를 제공합니다. 두 가지 서비스를 고려할 수 있습니다. SMS API 휴대전화로 SMS를 전송합니다. 회원 가입 이후 인증 시 서버에서 인증번호 생성하여 SMS 템플릿에 맞춰 전송하는 형태입니다. 사용자는 특정 시간 안에 전달받은 인증번호를 입력하고 이를 검증하면 됩니다. 가격 : $0.0436 ( 07-06 기준 57.16원) 제한 사항: 한국 SMS 제한 사항 Verify.. 2023. 7. 7.
1620 문제 요약 포켓몬 마스터가 되기 위한 도감 완성. 입력 도감에 기록된 포켓몬의 개수 N개 맞춰야 하는 문제의 개수 M개. 1 m; for (int i = 1; i > name; names[i] = name; numbers[name] = i; } string problem; for (int i = 0; i > problem; if (atoi(problem.c_str()) == 0) { cout m; for (int i = 1; i > name; names[i] = name; numbers[name] = i; } for (int i = 0; i > problem; if (atoi(problem.c_str()) == 0) { cout 2023. 7. 6.
2559 문제 요약 특정 기간 동안 온도를 측정했다, n일 동안 온도의 합이 가장 큰 값을 알아보고자 한다. 수열 : 숫자나 기호의 나열을 의미한다. 수열은 일정한 패턴이나 규칙에 따라 순서대로 배열된 원소들로 구성된다. 각 원소는 항이라고도 불린다. 입력 두 개의 정수 N과 K가 한 개의 공백을 두고 주어진다. N은 온도를 측정한 전체 날짜의 수이며 온도는 정수이다 (2 n >> k; for (int i = 1; i > tmp; sum[i] = sum[i - 1] + tmp; } for(int j = k; j 2023. 7. 6.
to Kotlin 자바 기반의 스프링 부트 애플리케이션을 코틀린으로 변경하는 과정을 담았다. https://github.com/sungil-yu/toKotlin/commits/main GitHub - sungil-yu/toKotlin Contribute to sungil-yu/toKotlin development by creating an account on GitHub. github.com 이는 CRUD 이외 큰 기능은 없지만 초기 시작을 위한 설정이나 Spring MVC, Spring Data Jpa를 사용하기 전 잠깐의 복습에는 많은 도움이 될 것이다. 2023. 7. 6.
왜 reflect.jar 파일이 별도로 존재하지? 리플렉션은 런타임에 프로그램의 구조를 파악할 수 있게 해주는 언어 및 라이브러리 features의 집합이다. 코틀린에서 함수와 속성은 일급 시민이다. 이를 검사하는 기능은 기능적 또는 반응형 스타일을 사용할 때 필수적이다. 일급 시민과 리플렉션은 직접적인 관계는 없습니다. 코틀린의 언어적 특성에 함수와 속성 등은 일급 시민이라는 것입니다. 다만 리플렉션을 통해 메타데이터(클래스, 함수, 프로퍼티 등)를 동적으로 액세스 하고 조작할 수 있다는 것입니다. 그리고 이러한 기능을 사용하는 경우 우리는 별도의 라이브러리인 kotlin-reflect.jar를 사용해야 한다는 것입니다. 이를 분리한 이유는 공식문서에서 설명한 것과 같이 다음과 같습니다. JVM 플랫폼에서 Kotlin 컴파일러 배포에는 리플렉션 기능을.. 2023. 7. 6.
Using JPA with Kotlin in a Spring Boot Application 보호되어 있는 글 입니다. 2023. 7. 5.
9996 문제요약 패턴은 알파벳 소문자 여러 개와 별표(* : 아스키값 42) 하나로 이루어진 문자열이다. *는 정규표현식의 *와 동일하게 동작한다. 0개 혹은 하나 이상이다. 주어진 패턴에 파일 이름의 일치 여부를 판단해라. 입력 문자열 길이는 100을 넘지 않는다. 별표는 문자열의 시작과 끝에 있지 않는다. 출력 입력으로 주어진 i번째 파일 이름이 패턴과 일치하면 "DA", 일치하지 않으면 "NE"를 출력한다. 풀이 정규표현식의 특정 표현을 만들어보는 유익한 경험이라 생각하자. 1차 시도 Failed (이 왜 틀?) #include using namespace std; int n; string pattern; vector result; int main() { cin >> n; cin >> pattern; ch.. 2023. 7. 4.
spring boot, gradle 설정에 kotlin 환경 설정하기. 우선 다음과 같이 build.gradle 파일에 코틀린 플러그인을 설정해주어야 한다. https://plugins.gradle.org/plugin/org.jetbrains.kotlin.jvm 2023. 7. 4.