Backend (40) 썸네일형 리스트형 [ Java ] String Constant Pool 이란? 금융결제원 필기 시험을 준비하면서 메모리 효율성 방안을 고민하다가 해당 개념을 정리해보았다. public class Test { public static void main(String[] args) { String a = "hello"; String b = "he" + "llo"; System.out.println(a == b); }}문제를 보고 출력되는 결과문은 false라고 생각했다. 서로 다른 String 객체가 생성될 거라고 생각했기 때문이다.하지만 정답은 true였다. 적잖이 놀랐다. 해설을 보니 문자열 리터럴 "hello"는 string constant pool에 저장되고 재활용되기 때문에 a와 b는 같은 참조를 하고 true를 출력한다고 한다... Spring 트랜잭션 내부 동작 원리 새마을금고중앙회 최종면접에서 떨어졌지만, 배운게 많다고 생각한다. 그 중 하나 2차 면접 때 명확히 답변을 하지 못했던 내용으로 트랜잭션 동작 원리에 대한 것이다. 면접 회고를 정리하면서 기술 공부를 조금 더 해보려고 한다. 스프링의 트랜잭션 관리는 애플리케이션의 데이터 일관성과 무결성을 보장하는 기술이고, 가장 핵심은 개발자가 비즈니스 로직에만 집중할 수 있도록 트랜잭션 경계를 대신 설정해준다는 것이다. 스프링은 JPA나 하이버네이트, JDBC와 같이 데이터 액세스 기술에 대해서 트랜잭션 API를 제공하고 있다. 또한 @Transactional 어노테이션을 이용해서 코드와 트랜잭션 로직을 선언적으로 분리할 수 있다. 트랜잭션 관리는 주로 AOP를 기반으로 동작한다. 면접 때도 어노테이션을 이용해 .. [FCM] CI/CD github secret에서 json 파일 만들 때 유의할 점 echo "${{ secrets.FCM_SETTING }}" > ./src/main/resources/firebase_service_key.json 이렇게 json 파일을 만들면 json이 깨진다. 요로코롬 해결책으로 json 값을 base64 인코딩한 값으로 secret에 저장하고 배포스크립트에서 json 파일을 만들 땐 decode를 진행해서 서버 배포를 준비한다.echo "${{ secrets.FCM_SETTING }}" | base64 -d > ./src/main/resources/firebase_service_key.json 원인이 뭘까? [Spring Boot] 버전 3.3에서 변경된 WARN Serializing PageImpl instances as-is is not supported 해결법 기존부터 사용하던 Pagenation인데 신규 플젝에서 이런 warn log가 발생했다.알아보니 버전이 3.3 이상부터 이 로그가 나타나는것을 알게되었다. Page 인터페이스의 직렬화 문제 때문에 새로 생긴 스펙인듯 하다. 2025-01-12T00:18:53.046+09:00 WARN 12196 --- [nio-8080-exec-2] ration$PageModule$WarningLoggingModifier : Serializing PageImpl instances as-is is not supported, meaning that there is no guarantee about the stability of the resulting JSON structure! For a stable JSON struc.. [Java] 일급 컬렉션 학습 내용 정리 학습 목적 : 멤버 테이블과 멤버가 가진 코인 정보 테이틀간 ERD 설계 및 개발 방향 고민 중에, 홈 화면에서 코인 조회 빈도가 많다보니, 코인정보는 캐싱하는 편이 나아보였다. Redis Cache 방향을 이야기하던 중, 일급 컬렉션이라는 말이 나왔고 처음 들어보는 워딩이다보니 공부를 해보고자 검색해보게 되었다. 정의 : 일급 컬렉션은 소트웍스 앤솔로지의 객체지향 생활체조 규칙 8. 일급 콜렉션 사용에서 언급되었다. 다른 객체와 동등한 지위를 갖는 컬렉션 객체를 의미한다. 즉, 컬렉션에 대한 처리를 하면서, 컬렉션 외 다른 멤버 변수가 없는 상태를 일급 컬렉션이라고 한다. 예시코드:public class Student { private List subjects; public Student(.. DDD 레이어드 아키텍처에 대한 고민 모놀리식 아키텍처라고 하면 계층구조를 Controller - Service - Repository를 떠올려왔었다. 백엔드에 발을 들이고 얼마동안은 인터페이스의 역할의 중요성도 모른채로 데이터가 요청이 들어오면 비지니스 로직을 거쳐 영속성 계층에서 데이터를 조회해 클라이언트에게 응답해주는 단순한 구조로만 여겼었다. 서비스의 목적은 클라이언트에게 올바른 결과값을 되돌려주는 점에서는 동의하지만, 개발 과정에서 고려했어야했을 포인트들을 놓친 채 시간을 보냈었던 점이 아쉬움이 남는다. API를 빠르게 만들고 정상 동작하는지 테스트만 진행하다보니 왜 이건 이렇게 작성해야하고, 이 방식이 왜 좋은지?에 대한 의문점을 가져오지 않았다. "만들면서 배우는 클린 아키텍처" 책을 읽으면서 내가 무심코 생각없이 만들었던 결.. Logback Rolling file appender 적용 (Docker volume mapping, Springboot ) 백엔드에 처음 입문했을 당시, 당시 상용배포한 프로젝트가 핑테스트 결과 서버는 동작중인데, api요청이 먹통으로 에러원인을 찾느라 고생했던 경험이 있다. 그 때 이후로 백엔드 개발에서 항상 관리하는 사항으로 로그를 확인하는 과정을 구체화시키게 되었다. Logback 라이브러리를 활용해선 로그 파일을 저장하고, 추후 Sentry로 Exception을 전송시킬 예정이다. EC2 디스크의 용량은 한계가 있다보니 RollingFileAppender로 3일 주기로 로그 파일을 삭제하게 진행하려고 한다. 로컬에서 개발할 때 콘솔 로그는 확인을 해야하니 Appender를 Console과 File 두개를 작성해서 xml 파일을 완성하려고 한다.현재 EC2에서 JAR가 돌고 있기 때문에 CICD가 진행될 때마다 새로운.. CICD 환경변수 문제 기록 (github actions, docker, ECR) 이전 프로젝트에서는 application.yml을 통째로 깃허브 secret에 저장시켜 jar 빌드할 때 사용하게 개발했었다. 이 문제점은 application.yml의 내용을 notion에서 관리중이었는데 변경 이력을 볼 수 없다는 점과 너무 많은 내용이 적혀있어 확인하기 어렵다는 점이었다. 특히 카카오,구글,애플 oauth 관련 시크릿 키들을 넣으면서 yml이 복잡해졌었다. 신규 springboot 프로젝트에서 이전과는 다르게 환경변수를 도입해서 application.yml을 관리하기로 했다. 위 사진처럼 예를 들면 이런식으로 yml이 적히게 된다. CICD 스크립트 순서를 먼저 작성해보았다.실행순서1. 깃허브에 DEFAULT 브랜치에 PUSH가 일어나면 EC2에서 동작 중인 runner가 ch.. 이전 1 2 3 4 5 다음