개발 기록

개발 기록

java.io.NotSerializableException가 Spring Entity(Dto)에서 일어날 때 원인, 해결 방법

해결 방법 기본적으로 NotSerializableException이 일어나면 해당 클래스를 직렬화(implements Serializable)하면 해결된다. 이 오류는 아래 사진처럼 java.io.NotSerializableException 뒤에 익셉션이 발생한 클래스를 알려주는데, 그 클래스를 수정하면 되는 것이다. public class Product implements Serializable { @Id @Column(length = 50) private String id; @Column(nullable = false, length = 500) private String name; } 위 코드에서 implements Serializable을 통해 직렬화가 가능한 클래스라는 것을 명시했다. 원인 필자는..

개발 기록

spring.jackson.property-naming-strategy 설정 적용 안될 때 해결 방법 (@EnableWebMvc)

문제 필자는 백엔드 API에서 받는 request 및 리턴하는 response JSON의 형식을 스네이크 케이스로 통일하고 싶었다. 그를 위한 방법은 1. request, response 클래스에 @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) 어노테이션을 다는 방법 2. application.properties에 spring.jackson.property-naming-strategy=SNAKE_CASE 설정을 추가하는 방법 (전역) 크게 이 두 가지 방법이 있었다. 1번 방법을 사용할 경우에는 request, response (dto) 클래스 모두에 적용해야 하기 때문에 굉장히 번거롭고, 코드도 지저분해진다. 그리하여 2번 방법을 사용하려고..

개발 기록

빌드, 컴파일 차이

컴파일 소스코드를 바이너리 코드로 변환하는 과정이다. java의 경우 컴파일의 결과로 JVM에서 실행 가능한 바이트코드 형태의 ".class" 파일이 생성된다. 컴파일은 빌드를 진행하는 과정 중 하나이다. 빌드 소스 코드 파일을 컴퓨터에서 실행할 수 있는 독립적인 형태로 변환하는 것을 말한다. 예를 들어 java 프로젝트에서는 개발자가 작성한 java 소스코드와 정적 파일들에 해당하는 resource가 존재하는데, 빌드를 실행한다면 소스코드를 컴파일하여 .class 확장자 파일로 변환하고, resource를 .class에서 참조할 수 있는 적절한 위치로 옮긴 뒤, META-INF와 MANIFEST.MF들을 하나로 압축한다. 일반적으로 빌드 툴은 전처리(Preprocessing), 컴파일(Compile),..

개발 기록

docker no space left on device 트러블 슈팅 | EC2 프리 티어 오류 해결

발단 평소처럼 개발 후 Github에 올리고, Github Actions를 통해 EC2 서버로 CD 진행 중에 err: docker: failed to register layer: Error processing tar file(exit status 1): write /usr/local/openjdk-11/lib/server/classes.jsa: no space left on device.\ 오류가 발생했다. CD 때문에 꺼진 서버는 프로덕션 서버였기에, 1분이라도 빨리 해결해야 했다. (참고로, 필자는 EC2 프리티어 서버를 사용하고 있다.) 아래에 시도했던 해결 과정, 그리고 마침내 해결한 방법을 적었다. 해결 시도 1 : 메모리 부족인가 프로덕션 서버 CD 중 갑자기 나타난 no space 오류에,..

개발 기록

Github Actions CD 트러블슈팅 모음 (SpringBoot 서버 + Docker + AWS EC2)

Github Action과 EC2를 이용해 Spring Boot 서버를 배포하고 CD(Continuous Deployment)를 시도하면서, 별별 에러 때문에 난항을 겪고 있었다. 다른 사람의 고통에 조금이라도 도움이 될 수 있을 것 같아, 에러 해결의 일대기를 한 번 적어보려 한다. 여기서 설명하는 레포지토리는 아래 링크를 참고하면 된다. https://github.com/EAT-IT-DOG/eatitdog-server-v2 먼저, 나는 아래 그림과 같은 방식으로 CD를 처리하려고 계획했다. EC2 프리티어는 굉장히 작고 소중하기 때문에 EC2에서 빌드하기 보다는 빌드된 docker 이미지를 풀받아서 컨테이너를 올리는 방식을 채택했다. 또한 Jenkins 말고 Github Actions를 사용한 이유는..

개발 기록

작고 소중한 EC2 프리티어 사용률 100% 찍을 때 대처법

무료인 EC2 프리티어를 사용할 때, 자바 빌드를 하다 보면 CPU 사용률이 100%를 찍으며 EC2 서버가 멈춘다. 이 문제가 일어나는 이유는, EC2 프리티어를 사용할 경우 t2.micro의 RAM이 1GB밖에 되지 않아, 메모리가 부족하여 ssh 접속도 멈추는 경우이다. 나도 이 문제때문에 EC2와 멀어졌다가, 최근 해결법을 알아서 공유해보고자 한다. 사전에 swap 메모리를 할당한다 아래처럼 EC2 인스턴스의 리눅스 쉘에 명령을 입력하여 작업한다. 임시로 swap 메모리를 설정하게 되면, 프리티어의 EC2 메모리가 부족하더라도 swap 메모리로 메꿔 여러 개의 프로세스를 동시에 띄울 수 있게 된다. EC2 프리티어의 기본 RAM이 1GB이니, 2GB swap 파일을 만들어 할당한다. (128MB ..

개발 기록

HTTPS 도대체 왜 쓰는 거야? | HTTPS, SSL Handshake

선행 지식 CA (Certificate Authority) : 인증서를 발급해주는 기업. SSL을 적용하기 위해 인증서가 필요한데, 인증서는 서비스의 정보, 서버 측의 공개키가 포함되어 있다. Handshake : 통신 시작 시 클라이언트와 서버가 서로 신분을 확인하고, 필요한 정보를 주고받는 과정이다. 대칭키, 비대칭키 HTTP 통신의 허점 우리가 기본적인 HTTP 프로토콜을 사용하는 웹서버(웹앱서버)를 띄워 로그인 API를 호출할 때, 아이디와 비밀번호를 서버로 보내면 입력한 텍스트는 누구든 알아볼 수 있는 평문으로 보내진다. 만약 누군가가 중간에서 이 정보를 탈취한다면 유저의 아이디와 비밀번호를 고스란히 알게 된다. 이러한 치명적인 보안적 허점을 해결하기 위해 인증서를 발급받고, 그 인증서를 기반으..

개발 기록

HTTP 쿠키, 세션, 토큰 뿌시기 + 토큰(JWT) 보안 전략

HTTP 특성 HTTP는 인터넷 상에서 데이터를 주고 받기 위한 서버/클라이언트 모델을 따르는 프로토콜이다. 클라이언트가 서버에게 요청을 보내면, 서버는 응답을 보냄으로써 데이터를 교환한다. HTTP는 비연결성 및 무상태성이라는 특징을 가지고 있다. HTTP는 요청 처리 후 연결을 끊어버리기 때문에, 클라이언트의 상태 정보 및 현재 통신 상태가 남아있지 않다. 비연결성의 장단점 이 비연결성의 장점은 서버의 자원 낭비를 줄일 수 있다는 것이다. 만약 다수의 클라이언트와 연결을 유지한다면 자원 낭비가 심해질 것이다. 허나 비연결성은 클라이언트를 식별할 수 없다는 단점 또한 존재한다. 로그인을 하더라도 다음 요청에서 해당 클라이언트를 기억하지 못해서, 무한 로그인을 해야 할 것이다. 심지어 브라우저 새로고침을..

개발 기록

Spring에서 Naver Cloud Object Storage 사용할 때 에러 사냥하기

학교 동아리에서 교내 학생 관리 서비스를 NestJS에서 SpringBoot로 마이그레이션 하던 중, 서버에 직접 저장하던 이미지를 클라우드로 저장해 좀 더 복구/유지보수하기 좋게 만들기로 했다. 하지만 우리 동아리는 "AWS는 외국 서버기 때문에 그곳에 학생들 데이터를 저장할 수 없다"라는 학교의 말도 안되는 주장때문에 Naver Cloud를 쓰고 있었다. 학교의 지원을 받기 위해서는 AWS S3 대신 Naver Cloud가 서비스하고 있는 Object Storage를 사용해야 했다. 기존 Spring으로 AWS S3를 사용하기 위해 지원하는 디펜던시가 있었다. (Gradle) implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2..

개발 기록

AWS EC2 작동이 굉장히 느려졌을 때...

프로젝트를 하면서 외부 서버로 배포할 일이 생겨 AWS의 EC2 인스턴스를 만들고 실행시켰다. ssh로 접속하여 여러 패키지들을 다운받고, 도커로 서버를 배포했다. 하지만 그 과정에서 터미널 입력 반응 속도가 굉장히 느렸고, 패키지 설치도 이래도 되나 싶을 정도로 느렸다. 그렇게 정감 떨어져가며 몇일을 AWS 만지고 있던 찰나, 갑자기 AWS EC2 콘솔에 들어가보니 인스턴스가 안보인다. 근데 갑자기 저번 전공역량강화 수업 때 배웠던 '리전'(지역) 개념이 생각나는 것이다. 혹시나 해서 다른 리전을 찾아보니, 역시나 서울이 아닌 미국 캘리포니아에 EC2 서버를 만들었던 것이다... 허허 캘리포니아에 있던 EC2 인스턴스를 종료(삭제)한 다음 다시 서울 리전에서 EC2 인스턴스를 만드니 콘솔 입력, 패키지..

개발 기록

2022/08/11 멘토님 코드리뷰에서 배운 점

1. 커밋을 잘 쪼개자 의미있는 단위로 커밋하기. 나중의 내가 알아볼 수 있고, 다른 사람도 알아볼 수 있도록. 2. 리뷰어를 위해 PR에 설명을 달아두자 대개 리뷰어는 코드를 작성한 사람에 비해 컨텍스트가 부족하기 때문에, 양질의 리뷰를 위해 리뷰어에게 배경을 설명해주는 것이 좋다. 3. 스프링 의존성을 주입받을 때는 생성자로 스프링 팀에서는 의존성 주입 시 constructor를 통해 주입받는 것을 권장하고 있다. 그 이유는 1. 순환 참조를 (컴파일 시점에) 방지할 수 있다. 생성자 주입은 빈을 생성한 후 의존성을 주입하는 세터 주입, 필드 주입과는 다르게 객체를 생성하는 시점(생성자)에 필요한 빈을 주입한다. 2. 테스트에 용이하다. DI의 핵심은 관리되는 클래스가 DI 컨테이너에 의존성이 없어야..

개발 기록

REST API 매핑 시 /를 넣을까? 말까?

초보 백엔드 개발자의 고찰이니 귀엽게 봐주세요 :) 최근 SpringBoot 프레임워크를 통해 REST API 서버를 개발하며 이러한 고민이 있었다. REST API를 설계할 때, /all, /{id}가 아닌 /만 마지막 문자로 올때는 어떻게 처리할까? 이 부분에 대해 개발 동아리 팀원과 상의해봤을 때, 갑론을박(까지는 아니지만 꽤 많은 대화)이 오갔다. Controller에 @GetMapping("/")으로 어노테이션을 넣게 되었을 때 실제 요청 주소에 /를 안넣으면 404 오류가 나고, @GetMapping("")으로 어노테이션을 넣었을 때는 요청 주소에 /를 넣으면 404 오류가 났다. 이것때문에 아예 Mapping 어노테이션에 value값 자체를 주지 말까도 생각해보고, @GetMapping(va..

개발 기록

Authorization과 Authentication 차이가 무엇일까? | 인증 및 권한 부여

웹앱의 관점에서 Authentication(인증)은 로그인을 통해 로그인한 사용자를 인식하는 것이며, Authorization(권한 부여)는 사용자가 CRUD 등을 허용하는지 여부를 확인하는 것이다. 권한 부여는 사용자의 신원이 인증된 후에 발생한다. 아래에서 좀 더 자세히 알아보자. Authentication 인증 로그인과 함께 사용자의 신원을 확인하는 프로세스 인증에 사용하기 위해 제공하는 데이터(id, password 등)는 이미 DB에 저장된 데이터와 비교 이 데이터는 인증 서버에 저장됨 인증 종류는 비밀번호 기반, SSO(Single Sign On), API 인증, 생체 인증 등이 있음 Authorization과 구별하기 위해, 줄여서 AuthN이라고 함 Authorization 권한 부여 누..

개발 기록/JAVA

Reflection API가 무엇일까?

Reflection API를 찾게 되기까지 Reflection API는 Spring 프레임워크를 다루며 종종 접한다. 필자도 Spring 프레임워크에서 쓰이는 JPA를 공부하다가 이 Reflection API를 공부하게 되었다. 이 글에서는 이것이 무엇인지, 왜 존재하는지 간단히 알아보자. Reflection API는 구체적인 클래스 타입을 알지 못해도 그 클래스의 정보(메서드, 타입, 변수 등등)에 접근할 수 있게 해주는 자바 API이다. 위 정의가 잘 이해가 가지 않아도 좋다. 아래 예제를 계속 보자. 자바 다형성의 문제점 자바의 다형성 덕분에 아래와 같이, 부모/조상 객체 타입에 객체 생성이 가능하다. 하지만 문제는, 이렇게 obj라는 객체를 생성했을 때 Car 클래스만의 메서드를 사용할 수 없다...

개발 기록

나선형 모델 | SPIRAL MODEL

나선형 모델이란? IT위키에 따르면, 나선형 모델은 "시스템 개발 시 위험을 최소화하기 위해 점진적으로 완벽한 시스템을 개발해 나가는 모델"이다. 나선(Spiral)이 반복된다고 하여 붙여진 이름이 나선형 모델이며, Boehm(보앰)이라는 사람이 제안하였다. 폭포수 모델과 원형 모델의 장점을 수용하고 위험 분석을 추가한 점증적 개발 모델이다. 그리하여 이 모델을 사용할 때 프로젝트 진행 시 위험을 최소화할 수 있다는 장점이 있다. 이 모델을 사용할 때의 특징은 다음과 같다. 위험 관리 능력에 따라 프로젝트 성공 여부가 달라짐 복잡성으로 인해 프로젝트 관리가 어려움 개발 장기화의 가능성 대규모 프로젝트, 국책 사업 등의 위험 부담이 큰 시스템 개발에 적합 나선형 모델의 진행 순서 위 사진과 같이, 나선형 ..

우준성
'개발 기록' 카테고리의 글 목록