-
API 문서 자동화로 시간 절약하기 (feat.Swagger)
배경 백엔드 개발자에게 API란 무엇일까요. 열심히 설계하고 작성한 코드가 의미가 있으려면, 그걸 받아서 작업하는 프론트 또는 앱 개발자분들에게 잘 전달되어야겠죠. 그렇습니다. API를 잘 작성하는 것도 중요하지만, 그걸 잘 전달하는 것 또한 매우 중요합니다. 그래서 API를 잘 전달하기 위해 API 명세서를 작성... ...
-
Spring Boot에서 국제화로 언어 장벽 허물기!
배경 최근 회사에서 진행하는 프로젝트가 글로벌 사용자를 타겟으로 두고 있어서 다국어 처리를 사용해 보게 되었는데요, 이에 대해 제가 알아본 방법과 작업하고 있는 방법을 정리해보겠습니다. Spring에서의 다국어 처리(국제화) Spring에서는 다국어 처리에 대해 국제화라는 기능을 제공하고 있습니다. messages... ...
-
Validation 그거 어떻게 하는건데
배경 백엔드 작업에서 Validation은 꽤나 중요도가 높은 작업으로, 클라이언트가 보내는 데이터가 서버에서 기대하는 형식과 규칙을 충족하는지 확인하는 과정을 의미합니다. 주로 웹 애플리케이션에서 클라이언트가 API를 통해 데이터를 전송할 때 백엔드에서는 이 데이터가 정확한지, 요구사항을 만족하는지 검증을 해야 데이... ...
-
이직 후기, 그리고 글또 다짐을 곁들인
이직 7월에 SI 스타트업으로 이직했습니다. 공모전 발표 다음날이라 순위의 영향은 크지 않았겠지만, 작업한 내용이 Github에 올라가 있으니 코드 내용으로 봐주셨겠죠. 조금 더 면접을 보고 결정하고 싶었지만, 포트폴리오가 괜찮은 편이라 긍정적으로 결정했습니다. 1월 퇴사 이후 전회사가 상식 밖으로 힘든 곳이었지만 오히려 개발자라... ...
-
AccessToken과 RefreshToken
AccessToken과 RefreshToken AccessToken은 사용자에 대한 정보를 담아 서비스에 접근(Access)할 수 있는 토큰이다. RefreshToken은 AccessToken과 다른 특별한 기능은 없지만, AccessToken을 새로 발급해주는 용도로 사용한다. AccessToken... ...
-
JWT(JSON Web Token)
JWT(JSON Web Token) ? JWT(Json Web Token)란 인증에 필요한 JSON 데이터를 암호화시켜 저장한 Web Token 왜 JWT를 사용할까? HTTP는 무상태(Stateless)와 비연결성(Connectionless)이라는 특성을 가지고 있다. St... ...
-
Mixed Content The page at '...' was loaded over HTTPS, but requested an insecure XMLHttpRequest endpoint '...'. This request has been blocked; the content must be served over HTTPS 에러를 Nginx에서 해결하기
배경 지난 프로젝트에서도 CORS 문제가 발생해서 하루만에 도메인도 구매하고 Nginx로 연결한 다음 Spring Boot 프로젝트에서 CORS 설정도 해줬었는데, 이번 프로젝트에서도 동일한 방법을 실행했지만 CORS가 해결되지 않는 문제가 발생했다. (이 문제로 서버도 몇 번이나 다시 만들고 nginx 파일을... ...
-
비사이드 403 포텐데이 Americanote 회고
Americanote ☕️ 프로젝트: 아메리카노트 (내 취향에 딱 맞는 아메리카노 카페 찾기 서비스) 프로젝트 기간: 2024.03.21 ~ 2024.03.30, 리팩토링 2024.04 기술 스택 Backend Java 17, Spring Boot, Spring Data JPA, QueryDSL S... ...
-
독서 관리 서비스의 Admin 개발 회고
홈페이지 마이그레이션, 도서 단행본 API 구현 업무를 마치고 나니 협력사와 아이가 도서를 읽고 독후감을 쓰면 첨삭해주는 서비스를 만들게 됐는데, 당시 일손이 부족해서 내가 관리자를 통으로 담당하게 되었다. 사수분들께서 바빠서 잘 봐줄 수 없을 것 같다고 하셔서 (ㅎㅎ) 기획서를 받기 전부터 조금 긴장했던 것 같다. 기초... ...
-
도서 등록 API 속도 개선 회고
홈페이지 마이그레이션 이후 새로운 업무를 받았다. 당시 자사 서비스인 도서 플랫폼에서는 사용자로부터 도서 등록 문의를 받아 등록해줬었다. 문의한 도서가 ‘전집’일 때는 운영팀에서 도서를 검색해서 개발팀에게 전달해 데이터베이스에 등록하는 과정을 거쳤지만, ‘단행본’일 때는 운영팀에서 관리자 페이지에서 직접 등록하기도 했다. 하지... ...
-
홈페이지 마이그레이션 회고
포트폴리오를 작성하다보니 생각보다 예전에 했던 프로젝트들이 회고해볼 만한 게 많아서 한 번 되짚어보려고 한다. 입사 당시 첫 주는 거의 일이 없어서 심심했었는데, 2주차에는 드디어 첫 업무를 받았다. Spring 4.3.3, Maven, JSP로 구성되어 있던 프로젝트를 Spring Boot, Gradle, Thym... ...
-
Integer Class
String toString(int n, int radix) 10진수를 N진수 형태의 문자열로 변환할 수 있다. String toBinaryString(int n) 10진수를 2진수 형태의 문자열로 변환할 수 있다. String toOctalString(int n) 10진수를 8진수 형... ...
-
아메리카노트 서버 구성 <6> HTTPS 적용
이전 단계에서 진행했던 방화벽에서의 80, 443 포트 허용과 도메인이 있다면 이제 기간은 짧지만 무료로 받을 수 있는 Letsencrypt의 SSL 인증서를 발급 받아보겠습니다. SSL 인증서 발급받기 인증서를 발급받기 위해 letsencrypt의 certbot을 설치해주고,... ...
-
아메리카노트 서버 구성 <5> 도메인 연결
자동 배포까지 했으니 어느정도는 백엔드 코드를 서버에 올리는 것까지 했다고 할 수 있겠습니다. 저도 여기가 마지막인 줄 알았으나.. 첨부한 이미지는 프론트분이 API가 요청되지 않는다고 캡쳐해주신 에러 메세지입니다. 읽어보면 HTTPS인 프론트 도메인에서 HTTP인 백엔드 도메인으로 요청하는 부분에서 ... ...
-
아메리카노트 서버 구성 <4> 자동 배포
layout: post title: 아메리카노트 서버 구성 <4> 자동 배포 subtitle: categories: wiki tags: [Server, NaverCloudPlatform, Project, Deploy, GithubActions] — 프로젝트를 서버에 배포해봤다면 ... ...
-
아메리카노트 서버 구성 <3> 프로젝트 배포
서버와 데이터베이스를 생성했다면 이번에는 서버에 프로젝트를 배포해보겠습니다. 1. 서버에 접근하기 ssh username@public-ip -p 22(허용 포트) # password 2. 서버에 JAVA 설치 sudo apt install openjdk-17-jdk java --version # 자바 버전 확인 3... ...
-
아메리카노트 서버 구성 <2> MySQL 데이터베이스 생성
이번에는 NCP에서 MySQL DB Server를 생성하고 연결해보겠습니다. DB Server 생성 고가용성까지는 필요 없기 때문에 해제를 해주고, 이전 단계에서 만들었던 VPC와 Subnet을 선택해주었습니다. 기본 설정에서 거의 건드리지 않고 DB server와 서비스 이름만 지정해주었습니다. ... ...
-
아메리카노트 서버 구성 <1> Linux 서버 생성
배경 비사이드 포텐데이403 프로젝트를 진행하면서 Linux 서버를 생성하기 위해 순서대로 정리해봤습니다. 1. OS 선택 레퍼런스가 많고 지속적으로 업데이트가 되고 있는 Ubuntu로 선택함 2. VPC(Virtual Private Cloud) 설정 전용 네트워크 ... ...
-
배열 오름차순/내림차순 정렬
배열 오름차순/내림차순 정렬 <1> 오름차순 정렬 오름차순 정렬은 아주 간단하다. Arrays 클래스의 sort() 메소드를 사용하면 된다. int[] A = {4, 3, 3}; Arrays.sort(A); // 결과: A = {3, 3, 4} <2> 내림차순 정렬 내림차순 정렬도 어렵진 않지만, 한 가지 주의할... ...
-
비사이드 포텐데이 403 프로젝트에서 Naver Cloud Platform 사용 후기
Q. 프로젝트를 소개해 주세요. 내 취향에 딱 맞는 아메리카노 카페 찾기 서비스 Americanote(아메리카노트)입니다. “카페 리뷰는 많은데 정작 커피 맛은 어떤지 모르겠어💦” “꼭 방문해서 먹어보고 커피 맛을 알아야 할까?” “내 취향에 딱 맞는 아메리카노를 먹고싶어!” 그래서 만들었습니다! Americanote는 카페를 ... ...
-
문자열 대치
종류 replace() replaceAll() replaceFirst() replace(CharSequence target, CharSequence replacement) 일치하는 문자열(target)을 새로운 문자열(replacement)로 치환한다. String str = "가/나/다/... ...
-
Queue
Queue(선형 큐) 특징 줄 서있는 것처럼 선입선출(FIFO) 형태의 자료구조 정해진 한 곳(top)을 통해서 삽입, 삭제가 이루어지는 스택과 달리 큐는 한쪽 끝에서 삽입 작업, 다른 쪽에서 삭제 작업이 양쪽으로 이루어진다. 큐의 뒤(rear)에서만 삽입(enqueue)하고, 큐의 앞(front)에서는 삭... ...
-
프로그래머스 - 같은 숫자는 싫어 풀이
문제 링크 연속적으로 나타나는 숫자, 즉 앞의 숫자와 겹치면 제거하기 때문에 Stack을 사용해서 풀이를 해보려고 한다. 풀이 첫번째 public int[] firstSolution(int[] arr) { Stack<Integer> answer = new Stack<>(); answer.add(arr[0]); for (in... ...
-
String 배열 -> String
배경 코딩테스트 문제를 풀면서 String 배열을 String으로 변환하는 작업이 자주 나와서 기록해두려고 한다. 1. String.join(CharSequence delimiter, CharSequence… elements) join() 메서드는 delimiter(구분자)를 사용하여 elements(대상 배열)을 문자열... ...
-
SpringBoot 3.2부터 @PathVariable 이름 미지정 시 에러
배경 팀원이 작업한 코드를 pull 받아서 실행시켰는데 아래처럼 에러가 발생했다. 그런데 팀원이 올리기 전에 실행시켰을 땐 발생하지 않았던 에러가 왜 내 로컬에서는 발생했을까? java.lang.IllegalArgumentException: Name for argument of type [java.lang.... ...
-
update 시 @CreatedDate를 붙인 컬럼에 null이 들어가는 문제와 해결 방법
배경 update문의 결과를 확인하는데 생성일 컬럼이 null로 update 되는 문제를 발견했다. 원인 정확히는 생성일 컬럼에 이름을 설정하기 위해 붙인 @Column 어노테이션의 옵션 중 하나인 updatable의 기본값이 true라서 값을 설정해주지 않은 생성일 컬럼에 null이 update 된 것... ...
-
hibernate6 custom function(MySQL Dialect)
배경 현재 프로젝트에서 QueryDSL을 사용 중인데 여기에 집계함수를 사용하고 싶어서 사용자 함수 추가를 위해 서치 후 적용해보려고 했다. 그런데 이게 웬일.. Spring boot 3점대에서는 hibernate 6.1을 기본으로 사용하고 있어서 당장 올해 3월까지 올라온 블로그 글... ...
-
List에서 원소 삭제하기 remove()
배경 코딩테스트로 문제를 풀다가 list에서 원소를 삭제하는 remove() 메소드를 사용할 때 값이 일치하면 삭제하고 싶은데 그냥 숫자를 넣으면 인덱스로 인식하는 것을 발견하였다. Integer remove(int index) 파라미터를 int로 전달하면 해당 index의 값을 삭제한다. boolean remov... ...
-
Windows 명령어
이동 cd [이동할 경로] 드라이브 변경 [드라이브 문자열]: // D: 현재 위치의 파일과 폴더 목록 조회 dir 네트워크 설정 상태 조회 ipconfig // all 옵션으로 상세 설정 정보 보기 가능 폴더 생성 md(or mkdir) [폴더명] 폴더 삭제 rm(rmdir) [폴더명] 환경 변수 path 조회 path 파일 삭제 del [파일명] 파일 복사 copy [복사할 파일명] [복사할 위치] xcopy [복사할 파일명] [복사할 위치] // 숨김파일도 ... ...
-
Thymeleaf와 @RestController
개요 테스트를 해보려고 테스트 컨트롤러에 @RestController을 설정한 후 String으로 view 이름을 리턴했더니 화면에 입력한 view 이름이 그대로 나왔다. @RestController public class TestController { @GetMapping("/sample") public... ...
-
Stack
특징 책을 쌓듯이 데이터를 차곡차곡 쌓아 올린 형태의 자료구조 선형 구조 같은 구조의 데이터를 정해진 방향으로만 쌓을 수 있다. 후입선출(LIFO) 구조: 마지막에 삽입된 데이터를 가장 먼저 꺼낸다. 데이터가 없을 때 pop하는 오류를 stack-underflow, 스택의 크기 이상의 데이터를 pu... ...
-
자바로 소수 판별
소수 1과 자기 자신으로만 나누어지는 숫자 0부터 N까지 소수 구하기 public int solution(int N) { int result = 0; int[] check = new int[N + 1]; for (int i = 2; i < N; i++) { if (check[i] == 0) { result++; ... ...
-
PRG 패턴과 RedirectAttributes
배경 및 문제점 POST로 가입하는 로직을 작성하다가 해당 페이지에서 새로고침을 하면 중복 가입이 되거나 성공 후 이동하는 로직에서 처리가 되지 않는 버그를 발견했다. 해결 방안 (=PRG 패턴) @PostMapping("/add") public String addItem(Item item) { i... ...
-
진수 변환
10진수 → 2/8/16진수 return type class method 설명 static String java.lang.Integer toBinaryString(int i) 10진... ...
-
MySQL IN
개념 여러 값을 OR 관계로 묶어서 나열하는 조건을 WHERE 절에 사용할 때 쓸 수 있는 키워드 IN 연산자는 조건의 범위를 지정하는 데 사용된다. 값은 콤마(,)로 구분하여 괄호 내에 묶고, 이 값 중에서 하나 이상과 일치하면 조건에 맞는 것으로 평가된다. 예시 -- OR 조건 표현 where condition = "A" ... ...
-
MyBatis와 JPA
먼저 MyBatis와 JPA를 알아보기 전에 알아두면 좋은 두 개념을 살펴보자. SQL Mapper SQL Mapper는 직접 작성한 SQL에 해당되는 데이터를 읽고, 결과값을 객체화시켜 사용할 수 있게 해준다. SQL에 데이터베이스에 따라 SQL 문법이 다르므로 특정 RDB에 종속적이며, SQL에 의존적인 개발하게 된다... ...
-
Map - getOrDefault(Object key, V defaultValue)
Map - getOrDefault(Object key, V defaultValue) public V getOrDefault(Object key, V defaultValue) { Node<K,V> e; return (e = getNode(key)) == null ? defaultValue : e.value; } key가 존재하면 key의 va... ...
-
Dangling meta character '?' near index 0
에러 코드 String[] split = question.split("?"); 원인 split() 메소드 사용시 특정한 문자를 regex로 사용하는 경우 동작하지 않는다. 특정한 문자: 이미 문법 상 사용 중인 특수문자 (|, &, ^, *, ?, . 등) 해결 방법 regex 앞에 백슬래... ...
-
IntelliJ 단축키 정리
설명 단축키 이름 변경(Rename) Shift + F6 접근제어자, 반환타입, 이름등 주요 정보 변경 Ctrl + F6 한 줄 ... ...
-
자바로 피보나치 수열 이해하기
피보나치 피보나치 수열은 재귀 함수의 대표적인 예시로, 첫째 및 둘째 항이 1이며 그 뒤의 모든 항은 바로 앞 두 항의 합인 수열이다. F(0) = 0, F(1) = 1일 때, 1 이상의 n에 대하여 F(n) = F(n-1) + F(n-2) 재귀 함수: 자기 자신을 다시 호출해 작업을 수행하는 함수 public int fibonacci... ...
-
default method
기존의 인터페이스 기존의 인터페이스는 추상 메서드만 존재할 수 있고, 이를 상속 받는 구현체에서 직접 해당 추상 메소드를 구현해야 한다. 이는 인터페이스에 메서드가 추가되면 그 인터페이스를 상속 받는 모든 구현체 클래스에 추가 메서드를 구현해주어야 하는 문제가 발생한다. 이 경우 확장(open)은 할 수 있지만, 변경에... ...
-
문자열 자르기
1. String.split() 지정한 구분자(정규표현식)로 문자열을 나눠 문자열 배열에 저장한다. 공백 포함 2. StringTokenizer 지정한 구분자(문자열)로 문자열을 나눈다. 구분자 생략 시 공백이 디폴트 생성자 StringTokenizer(String str) // 공... ...
-
아스키코드 문자 ↔ 숫자
10 16 문자 10 16 문자 10 16 문자 10 16 문자 0 0x00 NUL 32 0x20 ... ...
-
배열 자르기
1. Stream의 skip과 limit Arrays.stream.skip(num) skip은 숫자(num)만큼 아이템을 건너뛴 다음 그 뒤의 아이템으로 새로운 스트림을 생성한다. Arrays.stream.limit(num) limit은 지정한 개수(num)만큼 가져와서 새로운 스트림을 리턴한다. int[] array = {1, 2, 3, 4, 5, 6... ...
-
every single day
한동안 쉬었던 블로그를 개편하고 다시 열심히 쌓아보려고 한다..! 열정을 믿지 말고 성실하게 꾸준히 해보자! 파이팅! 공부 겸 위키용 블로그니까 틀린 부분이 있으면 언제든지 말씀해주세요~! ...