백엔드☕
-
[회고] 8개월간의 근무를 마치며...
2024년 2월 입사, 10월 퇴사까지... 8개월첫 직장(정규직)에서의 근무를 마쳤습니다 그동안 많은 일이 있었고 여러 현실적인 문제들을 처리하는 등 현생을 사느랴 퇴사한지 한 달만에 회고를 작성하게 되었습니다Liked : 좋았던 점은 무엇인가- 실무 경험을 할 수 있었습니다1) 여러 직무의 사람들이 유기적으로 소통하며 일하는 경험을 할 수 있었습니다.2) Git과 매.우. 친해질 수 있는 계기가 되었습니다. - 힘이 되는 사람들을 만났습니다팀장님 팀원들 그리고 동기들에게 많이 배웠습니다 Lacked : 아쉬웠던 점, 부족한 점- 고민을 해보고 질문을 하는 것이 중요하다고 생각해서, 충분한 고민을 했었습니다. 하지만 때로는 바로 질문하는 게 효율적이지 않았나라는 생각이 듭니다. - 사람들 앞에서 ..
2024.11.08 20:46 -
[AWS] EC2 삽질: AMI, 볼륨, 스냅샷 그리고 인스턴스 종료 방지
EC2 삽질 기록입니다.. 배경 설명 + 사건 발단 원인동일한 VPC 내에 EC2(A), EC2(B), EC2(C-모니터링) 가 존재하고 A, B는 서브넷(a)에 C는 서브넷(b)에 위치했었다 서브넷(a)는 AZ(1)에 위치했었고 서브넷(b)는 AZ(2)에 위치해있었다 즉, 서브넷(a)와 서브넷(b)는 인터 AZ 통신 요금이 발생했다 (1GB당 약 $0.01) 사실 원래 목적은 A, B 서버가 제대로 동작하고 있는지 C에서 확인해야 하는 것이기에 하나의 AZ가 장애가 나더라도 다른 AZ는 영향을 받지 않도록 하여 C에서 감지하고 문제있어요!! 라고 알림을 주는 것을 원했는데 I'm broke 의 이유로 서브넷(a) 에 를 두고 싶어졌다 ㅎ AZ를 직접 옮길 수가 없다 따라서, 아래와 같은 작업을 ..
2025.03.23 20:33 -
[코틀린] 코틀린 찍먹 (Spring Boot + Java => Kotlin 같이 사용하기)
build.gradle 1. Kotlin 플러그인 추가 id 'org.jetbrains.kotlin.jvm' 2. Kotlin 표준 라이브러리 의존성 implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8" 3. Java + Kotlin 혼합 지원Gradle 기본 지원 4. JVM 버전 명시 kotlin { jvmToolchain(17) } Java 파일을 Kotlin 파일로 변경할 수 있다 아직 문법을 모르기에 xxxException 클래스를 코틀린 파일로 변경해보기로 했다 주요 문법 차이 비교클래스명 : 인터페이스, 클래스 //상속 관계 표시 타입 대신에 val , var 키워드 사용String name = "Alice";int age = 30;val ..
2025.04.12 21:18 -
[그라파냐] 그라파냐 기본적인 사용법 : 등록, 대시보드 구성
그라파냐데이터 시각화 도구 Data Source 등록 Home > Connections > Data Sources 1) Add DataSource 2) Prometheus- Connections Prometheus server URL 도커로 Prometheus 띄우고 있어서 데이터 수집되는지 확인하기 어려웠음도커이름:포트번호 대시보드 구성직접 구성할 수도 있고 기존의 대시보드를 불러올 수도 있다 https://grafana.com/grafana/dashboards/ Grafana dashboards | Grafana LabsNo results found. Please clear one or more filters.grafana.com
2025.03.20 10:32 -
[Kubernetes - 1] Docker : 컨테이너가 필요한 이유
Why need containers?1. 기존 운영 체제와의 호환성2. 서비스와 라이브러리 간의 의존성 3. 개발, 테스트, 운영 간의 다른 상태 What can it do?OS 위에 Docker만 설치하면 의존성 있는 것들은 컨테이너 안에 들어가 있음 OS 동작 방식OS커널 + 소프트웨어 커널 : 하드웨어와 상호작용 소프트웨어 : 이게 OS를 다르게 만듦 ! 도커는 공통의 Linux 커널을 공유함 그리고 도커의 컨테이너는 소프트웨어만 가지고 있음 Sharing the KernelDocker 컨테이너는 호스트의 커널을 공유하기 때문에 가능함 아 그러면 윈도우는 Linux Kernel에서 실행되는게 아니라 다른 OS 가 필요한데 그러면 Docker 의미 없는 거 아님? Docker의 주목적은 응용 프..
2025.03.03 20:06
Git&Jira🛠️
프로젝트를 진행하며 생각을 했다
-
[AWS] EC2 삽질: AMI, 볼륨, 스냅샷 그리고 인스턴스 종료 방지
EC2 삽질 기록입니다.. 배경 설명 + 사건 발단 원인동일한 VPC 내에 EC2(A), EC2(B), EC2(C-모니터링) 가 존재하고 A, B는 서브넷(a)에 C는 서브넷(b)에 위치했었다 서브넷(a)는 AZ(1)에 위치했었고 서브넷(b)는 AZ(2)에 위치해있었다 즉, 서브넷(a)와 서브넷(b)는 인터 AZ 통신 요금이 발생했다 (1GB당 약 $0.01) 사실 원래 목적은 A, B 서버가 제대로 동작하고 있는지 C에서 확인해야 하는 것이기에 하나의 AZ가 장애가 나더라도 다른 AZ는 영향을 받지 않도록 하여 C에서 감지하고 문제있어요!! 라고 알림을 주는 것을 원했는데 I'm broke 의 이유로 서브넷(a) 에 를 두고 싶어졌다 ㅎ AZ를 직접 옮길 수가 없다 따라서, 아래와 같은 작업을 ..
2025.03.23 20:33 -
[쀼] Notification에 동시에 두 번 저장 요청 되는 문제 : Unique 제약 조건 지키지 않는다는 예외 발생 원인을 파악해보자
Unique 제약 조건 지키지 않는다는 예외 발생java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '2' for key 'subscriber.UK_8c0uhesq6q9u4ur7givn6u6pl' # 알림을 구독하겠다는 로직 subscriberRepository.save() 여기에서 에러가 났다 - JPA 엔티티 Subscriber가 아래처럼 구현되어 있었다 어? 두 번 요청이 들어온다는 것을 깨달았다 그래서 프론트앤드에서 로그를 찍어 봤다 - 문제 발생 원인 : 프론트에서 /subscribe 로 동시에 2번이나 요청을 하고 있었다 백엔드 예외 발생한 상황 분석 발생 시나리오동시에 같은 userId에 대한 subscribe() ..
2025.03.17 17:47 -
[쀼] 백엔드 서버, 데이터베이스 서버 분리 (MySQL 직접 운영)
동일한 서버 내에 백엔드, 데이터베이스가 위치하고 있었다 임시로 Docker로 올려놓고 사용하고 있었는데 ec2 분리하는 김에 AWS RDS는 비싸니 직접 설치하여 사용하기로 했다 백엔드- mysql에 접근할 때 사용할 유저이름, 패스워드 설정spring.datasource.url=jdbc:mysql://:3306/spring.datasource.username=spring.datasource.password= MySQL 설치 1. ec2 생성2. MySQL 설치 sudo apt updatesudo apt install mysql-servermysql -h -u -p 3. MySQL 보안 설정 실행mysql_secure_installation VALIDATE PASSWORD COMPONENT 사용 ..
2025.02.21 12:05 -
[쀼] S3에 업로드한 사진 : 이미지 핫링크 방지 과정 (3)
자 어디가 문제인지 확인해보자 가설1. CloudFront-Policy, CloudFront-Signature, CloudFront-Key-Pair-Id 를 생성하는 로직이 잘못되었을 것이다. ⚠️ 쿠키를 설정하여 Postman으로 요청을 보내보는데 누락된 키 쌍 ID 쿼리 매개 변수 또는 쿠키 값 이라는 메시지가 리턴되었다 🧰 개인키를 로드하는 코드에서 외부 라이브러리(Bouncy Castle)를 사용하여 PEM파일을 읽어오도록 코드를 변경하였다 🧰 직접 구현하였으나 =을 _로 변경하는 등 요구사항이 많아 CloudFrontUtilities (getCookiesForCustomPolicy) 를 사용하기로 했다 API 래퍼런스 : CloudFrontUtiliteshttps://sdk.amazon..
2025.02.11 12:09 -
[쀼] S3에 업로드한 사진 : 이미지 핫링크 방지 과정 (2)
핫링크가 무엇이고 왜 방지하려고 하는가 핫링킹은 다른 호스팅된 서버에서 파일을 다운로드하지 않고 링크하는 행위이다해당 파일을 핫링킹하여 사용자의 서버에 호스팅하면서 출처를 제공하지 않는다 쀼에 설정이 필요한 이유 쀼는 추억이 담긴 개인 사진을 업로드할 수 있는 프로젝트이기 때문에 무엇보다 이미지에 대한 보안이 필요하다 어떻게 방지할 수 있는가 1. CloudFront Signed URL + 캐시 유효 시간 설정 혹은 CloudFront Signed Cookie 혹은 CloudFront WAF에서 Referer 헤더 검증 2. 오리진에서 직접 접근 차단 (CloudFront만 거치도록 제한) 3번은 저번 글에서 S3에 CloudFront만 접근할 수 있도록 하였다 2번은 1번을 진행한다면 개선이 되는 부..
2025.02.10 12:52
프론트
-
[CSS] 직면하며 배우는 CSS (1) : overflow, position 속성
Overflowoverflow-x : 가로 영역이 넘칠 때 어떻게 할 것인가overflow-y : 세로 영역이 넘칠 때 어떻게 할 것인가 속성의 종류에는 5가지가 있다 1. visible블록 수준을 벗어난다 할지라도 다 보여준다스크롤 없음2.hidden블록 수준을 벗어나면 숨긴다스크롤 바 없음 3. clip클립과 숨김의 차이점은 클립 키워드가 프로그래밍 방식 스크롤을 포함한 모든 스크롤도 금지한다는 것이다. 4. scoll요소의 패딩 상자 내부에 가로로 맞도록 필요한 경우 오버플로 콘텐츠가 잘립니다. 브라우저는 콘텐츠가 실제로 잘리는지 여부에 관계없이 가로 방향으로 스크롤 막대를 표시합니다. (이렇게 하면 내용이 변경될 때 스크롤 막대가 나타나거나 사라지는 것을 방지할 수 있습니다.) 5. auto내용..
2024.09.02 18:29 -
[리액트] 공식문서 읽기 : useContext
- Props Drilling 피하기 위해 context를 사용해 데이터를 전달하는 과정이 필요하다 Context 사용 전에 먼저 고려해야 할 사항1. Props 전달2. 컴포넌트를 추출하여 JSX를 Children으로 전달 Context 적합한 사용 예시 1. 테마 지정 : 최상위에서 조정2. 현재 계정 정보3. 라우팅 정보4. reducer를 context와 함께 사용 문제 상황 예시)export default function Section({children}) { return ( {children} );} Context 사용 예시) - Heading 이Context에서 Level 정보를 알 수 있도록 함export default function Hea..
2024.07.15 09:16 -
Webpack ?
Webpack자바스크립트 애플리케이션의 모듈 번들러로 사용되는 도구 하나 이상의 진입점에서 내부적으로 종속성 그래프를 구축한 다음프로젝트에서 사용하는 모든 자바스크립트 파일을 하나 또는 여러 개의 번들 파일로 결합함 - entry내부 종속성 그래프를 시작하기 위해 웹팩이 사용해야 하는 모듈Webpack은 진입점이 의존하는 다른 모듈과 라이브러리를 파악함 기본값 : ./src/index.jsmodule.exports = { entry: './path/to/my/entry/file.js',}; - outputwebpack이 생성한 번들을 내보낼 위치와 이러한 파일의 이름을 지정하는 방법기본값 : ./dist/main.jsconst path = require('path');module.exports = {..
2024.07.03 17:51
CS
-
[쀼] 아 그래서 CORS가 뭐에요 : 개념 + 설정예시
(개념과 동작 원리를 정확히 몰라서) 수많은 억까를 당했고구글링으로 Mdn 문서를 찾아 이해한 후 해결함 (역시 정식대로 가야 함)발견했던 cors 핵심 개념을 적어보고자 한다 CORSCORS는 브라우저가 자신의 출처가 아닌 다른 어떤 출처로부터 자원을 로딩하는 것을 허용하도록 서버가 허가 해주는 HTTP 헤더 기반 메커니즘이다. CORS가 동작하는 세가지 시나리오 1. Simple RequestPreflight Request 요청없이 서버에 직행으로 본 요청을 보낸 후, 서버가 이에 대한 응답의 헤더에 Access-Control-Allow-Origin 헤더를 보내주면 브라우저가 CORS 정책 위반 여부를 검사한다. 1) 요청의 메소드는 GET, HEAD, POST 중 하나다 2) Accept, Ac..
2025.02.14 11:49 -
[쿠키🍪] 서드파티쿠키, 공격유형(중간자공격, XSS, CSRF)
Thrid-Party Cookie- 도메인과 스키마가 다르면, 같은 사이트에서 오지 않은 것으로 간주하고 이를 타사 쿠키라고 한다. - 도메인과 스키마가 사용자가 현재 보고 있는 브라우저 주소창에 표시된 URL과 일치하면, 쿠키는 페이지와 동일한 사이트에서 온 것으로 간주되며 이를 First-Party Cookie 라고 한다. Thrid Party Cookie 전송 예시- 한 사이트의 링크를 클릭하여 다른 사이트로 이동하는 경우- 페이지가 다른 사이트의 구성 요소를 임베드하는 경우 중간자 공격요청을 중간에서 가로채셔 변조하여 전달하는 공격 https://developer.mozilla.org/en-US/docs/Glossary/MitM MitM - MDN Web Docs Glossary: Definiti..
2025.02.14 09:41 -
[쿠키🍪] SameSite, Path, Domain 와 Request.credentials
쿠키HTTP 프로토콜이 무상태인 것을 보완하여 세션 관리, 개인화, 추적의 목적으로 사용되는 작은 데이터이다도메인당 최대 쿠키 수와 쿠키당 최대 크기를 제한하고 있다 쿠키 생성Set-Cookie : =Set-Cookie : =... 쿠키 제거- 영구쿠키 : Expires, Max-Age 속성 설정에 따라 만료일이 결정된다 - 세션쿠키 : Expires, Max-Age 는 현재 세션이 종료되면 삭제된다 쿠키 보안과 정책보안적인 이유로 브라우저는 쿠키를 어떻게 저장하고, 언제 전송할지에 대한 정책을 엄격하게 관리한다.교차 사이트 요청이 있을 때 쿠키가 자동으로 전송되지 않도록 제한을 두는 방식으로 보안을 강화한다.SameSite, Secure, Path, Domain 등의 쿠키 속성은 교차 사이트 요청에서 ..
2025.02.11 17:12
ProblemSolving💯
-
[코드트리] 스승의 은혜2
아이디어 N명의 학생에게 B만큼의 예산으로 선물을 주려고 하는데 한 학생의 선물만 반값으로 할인받을 수 있다 반값 할인할 학생을 하나 선택한 다음에 가격이 낮은 순서대로 B 예산 전까지 확인하여 선물을 준다 소스코드 import java.io.*;import java.util.*;public class Main { static int[] price; public static void main(String[] args) throws Exception{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new..
2025.02.07 17:31 -
[프로그래머스] 디스크 컨트롤러
문제 요약 - 문제https://school.programmers.co.kr/learn/courses/30/lessons/42627 아이디어 시간에 대한 처리? 소스코드 import java.util.*;class Solution { static int JOB_SIZE; public int solution(int[][] jobs) { // 요청_시각 작업_소요_시간 JOB_SIZE = jobs.length; List arr = new ArrayList(); for(int i = 0; i x.reqTime)); // 요청 빨리 온 순서대로 PriorityQ..
2025.02.04 18:11 -
[프로그래머스] 가장 큰 수
문제 요약 - 문제https://school.programmers.co.kr/learn/courses/30/lessons/42746# 아이디어 단순하게 A + B 랑 B + A 중 뭐가 더 큰지 확인해서 sort하면 되는 문제였다 소스코드 import java.util.*;public class Solution { public String solution(int[] numbers) { String[] arr = new String[numbers.length]; for (int i = 0; i (o2 + o1).compareTo(o1 + o2)); if (arr[0].eq..
2025.02.04 14:25
🎁에러 - 담에는 빠르게 헤어지자
-
[Grafana] prometheus 연동시 origin 에러
-
[프론트앤드] Vite : process not defined, env 파일 읽기
-
[백엔드 - 스프링부트] 2025-01-06 12:08:59.129 WARN 13000 --- [nio-8080-exec-7] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation]
-
[swagger] Failed to fetch. Possible Reasons: CORS, Network Failure, URL scheme must be "http" or "https" for CORS request