4차산업혁명의 일꾼/백엔드 39

@OneToOne 연관관계에서 Lazy Loading을 설정할 때 주의할 점은 무엇일까요?

양방향 @OneToOne일 때 연관관계의 주인이 아닌 엔티티를 조회할 경우 Lazy Loading이 동작하지 않습니다.JPA는 연관된 엔티티가 없으면 null로 초기화하고, 있으면 Lazy Loading이 설정되어 있을 경우 프록시 객체로 초기화합니다. 하지만 데이터베이스의 테이블 관점에서 보면, 연관관계의 주인이 아닌 엔티티는 연관관계를 참조할 FK가 없기 때문에 연관관계의 존재 여부를 알지 못합니다. 그래서 JPA는 null 혹은 프록시 객체 중 무엇으로 초기화할지 결정할 수 없게 되고, 결과적으로 연관된 엔티티의 존재 여부를 확인하는 추가 쿼리를 실행하기 때문에 Lazy Loading이 동작하지 않습니다. JPA의 한계이기 때문에 단방향으로 모델링하거나 Lazy Loading이 정말 필요한 것인지 ..

이미지 업로드로 인한 저장 공간 급증

3600만 명의 사용자를 보유한 SNS 피드 서비스에서 3~10MB 이미지 업로드로 인한 저장 공간 급증과 비용 상승 문제는 스케일과 비용 최적화 관점에서 신중히 접근해야 합니다. 다음은 현실적이고 효과적인 개선 접근 방법들입니다:---✅ 1. 이미지 압축 (Image Compression)설명:업로드 시점에서 이미지를 자동으로 압축하여 저장 공간을 줄임.WebP, AVIF 같은 최신 포맷으로 변환하면 JPEG 대비 30~70% 절약 가능.구현 방식:서버 또는 클라이언트에서 업로드 전 압축 (선호: 클라이언트 측 압축 + 서버 검증).사용 라이브러리 예: sharp, ImageMagick, libvips.---✅ 2. 썸네일 및 리사이징 전략설명:원본 이미지는 보관하되, 피드용으로는 작은 버전(예: 10..

가비지 컬렉터(Garbage Collector, GC) 특징

Java에서 가비지 컬렉터(Garbage Collector, GC)는 프로그래머가 직접 메모리를 해제하지 않아도 되도록 더 이상 사용되지 않는 객체를 자동으로 탐지하고 제거하여 Heap 메모리를 회수하는 역할을 합니다. Java 가상 머신(JVM)의 중요한 메모리 관리 기능 중 하나이며, 객체 생명 주기와 메모리 구조를 기반으로 작동합니다.---🧠 기본 개념Heap 메모리: Java에서 객체가 동적으로 생성되는 공간.Reachable object: GC 루트(GC Root)에서부터 참조되는 객체.Unreachable object: 더 이상 참조되지 않는 객체 → GC 대상.---🚦가비지 컬렉션의 기본 동작 과정1. Mark (표시 단계)GC는 "GC Root"에서 시작해 참조되고 있는 객체들을 찾아 ..

항해 Lite 백엔드 코스 1주차 WIL

Chapter. 1 TDD [챕터 목표]테스트 가능한 코드(Testable Code)의 의미를 명확히 이해하고, 다양한 종류의 테스트를 작성하며, TDD 기반의 요구사항 기능 개발을 학습합니다.TDD(Test-Driven Development)의 개념과 프로세스(Red-Green-Refactor)를 학습하고, 실제 실무에서 적용할 수 있도록 연습합니다.상황에 따라 적절한 테스트를 작성하는 전략을 학습합니다.단순히 테스트를 작성하는 것을 넘어, 왜 테스트가 필요한지 근본적인 목적과 중요성을 이해합니다.주어진 과제를 분석하고, TDD 방식을 이용해 직접 기능을 구현하는 경험을 쌓습니다. 챕터 목표를 보니 유지보수성있고 견고한 코드를 짜기 위해, 실패하는 케이스를 비롯한.. 여러가지 테스트 케이스를 남기기 ..

JPA 간단정리 2

이런식의 복합키와 상속구조는... 지양한다.@MapsId는 자식 엔티티의 기본 키를 부모 엔티티의 기본 키와 동일하게 매핑할 때 사용하는데...식별 관계는 부모테이블의 기본 키를 자식테이블로 전파하면서 자식테이블의 기본키 컬럼이 점점 늘어난다  특정상황에 조인 없이 하위 테이블만으로 검색 가능한 것이 식별뭐 classId를 쓰든 EmbeddedId를 쓰든 EmbeddedId가 좀더 객체지향적이라고는 하나, 어쨌건 그냥 비식별 관계로... ID를 생성하면서 자식엔터티에서 ManyToOne으로 다애일 관계를 맺는 형태로 Join하면...간단하긴 하다...// 연관관계 매핑 : 다중성(다대일, 일대다, 일대일, 다대다) - 단방향,양방향 - 연관관계의 주인(외래키를 가진 테이블, 많은 쪽, mapped by ..

JPA 간단 정리 1

데이터중심의 마이바티스와 달리 JPA는 객체 중심의 hibernate 이다.https://www.youtube.com/watch?v=brE0tYOV9jQ&t=98s이 ORM을 쓸줄 모르면~!쓰지 말라고 백기선 님께서 말씀하신다. TDD책에서 등장하신 분이네요~!연관관계 매핑을 제대로 할 지 모르면 쓰면 안된다고 하네요~! 어쨌건, JPA 김영한님 책 보면서 공부한거 정리해 봅니다.  쭈욱 보니까 JPA가 재밌는 건 data 중심에서 객체지향 중심으로 table을 설계한다는 것~! 상속매핑은 부모클래스에 @inhteritance를 사용한다. 조인전략부모클래스에 구분 컬럼을 지정한다. 이 컬럼으로 저장된 자식 테이블을 구분할 수 있다.@DiscriminatorValue("B") // 구분 컬럼에 입력할 값..

백엔드 TDD 비디오가게편

https://github.com/MyoungSoo7/tddtest GitHub - MyoungSoo7/tddtest: tddtesttddtest. Contribute to MyoungSoo7/tddtest development by creating an account on GitHub.github.com 자 유스케이스를 그려보고...TDD는 늘 소스는 내것이 아니라고 가르치니~모두를 위한 소스를 짜는 것을 고민하며..자 업무 시나리오와 개발가능 범위를 자판기편에서 했는데,https://iamipro.tistory.com/533 백엔드와 테스트 주도 개발 자판기편1. TDD 이모저모TDD는 기능중심의 단위 테스트를 해볼수 있고, 이를 연계해 통합테스트까지 가능하다. 사실상 QA 비용이 절감되는 반면.....

백엔드와 테스트 주도 개발 자판기편

1. TDD 이모저모https://github.com/MyoungSoo7/tddtest GitHub - MyoungSoo7/tddtest: tddtesttddtest. Contribute to MyoungSoo7/tddtest development by creating an account on GitHub.github.com  TDD는 기능중심의 단위 테스트를 해볼수 있고, 이를 연계해 통합테스트까지 가능하다. 사실상 QA 비용이 절감되는 반면... 개발시간이 늘어나는 부분이 있다. AC2 애자일 코치 김창준님은 TDD로 개발시간은 15%증가하지만 결함은 60%감소한다고 한다. 결국, 애자일 개발방법론에 있어서 TDD를 하면 결함률을 낮추어 유지보수성이 증가한다는 장점이 있고 Matchers, Hamcr..

항해 플러스 백엔드 3기 솔직 후기(Java는 1기편)

1) 항해 플러스를 참여하기 전 백그라운드- 처음 개발을 접한 것은 2017년 1월에 국비지원 부트캠프를 하면서부터였습니다. 그리고 2017년 8년에 수료한 이후, SI/SM업계에 개발을 했고 Spring/Java전성기에 시장에 투입되었습니다.- 공교롭게도 그 시기인, 2017년은 자바의 대체언어로 거론되는, kotlin을 구글에서 공식으로 안드로이드 개발언어로 인식한 해이기도 합니다.- SI개발업계에 있으면서 어느정도 시간적여유가 생겼을 때 정보처리기사, SQLD, AWS 자격증을 따고, 방통대 컴퓨터공학과 과정을 하면서, 회사에서 비즈니스컨설팅본부 SI컨설팅팀에서 SI개발을 하고 있었습니다.- 항해플러스 백엔드 3기부터 Java과정이 있어서 첫 Java 1기수로 합류하게 되었습니다. 2) 항해 플러스..

tdd 맨땅에 해딩하기..

주문한 책이 안온다... tdd를 여기저기 봐도... 이 상황에 적합한 최적화를 모르겠다. a to z를 다 하기 보다 그냥 맨땅에 해딩일단 조금 해보려고 한다. https://iamipro.tistory.com/461 데이터 모델링( 비즈니스 로직 tdd로 가기전) 설계라는것은 엄청난 것이라는 생각이 든다. 왜냐하면 창조적인 본능과 연계된 것으로 지구에서 눈에 보이는 것중에 인간만이 할 수 있기 때문이다. 여태까지는 도구를 쓴 부분만 생각했는데 iamipro.tistory.com 앞서 한 데이터 모델링을 기반으로 수강기능을 tdd로 해보려고 한다. 리포지토리 테스트는 끝났다~! JPA참 편하다ㅎㅎ~ 일단 tdd에서는 mock을 쓴다. mock은 tdd의 단위테스트의 독립성을 보장해주기 위해서 한다고 한..

TDD 9주차 WIL

문제 이번 주차를 지나며 겪었던 문제가 무엇이었나요? TDD 빌드가 안된다. 시도 문제를 해결하기 위해 어떤 시도를 하셨나요? mariadb를 MySQL로 바꿨다가.. h2db도 했다. 해결 문제를 어떻게 해결하셨나요? 안된다... 알게된 것 문제를 해결하기 위해 시도하며 새롭게 알게된 것은 무엇인가요? 단위테스트와, 통합테스트의 차이를 알게 되었다. tdd환경에서 build를 위한, 환경제어용 redis 가상테이너를 도커이미지로 만드는 것을 알게되었다. 동시성 제어를 위한 DB클린업을 알게되었다. 지난 목표 회고 지난 주에 설정해두었던 목표는 달성하셨나요? 잘된 것은 무엇이고 안된 것은 무엇인가요? tdd 나름 한것 같은데, 카프카나 이런것과 동시성제어 공부가 좀더 필요하다. 다음 목표 설정 반복적인 ..

WIL 커피숍 TDD 개발

※ 설계 및 분석 ※ TDD 개발과 ERD ※ TDD개발 상세 문제 이번 주차를 지나며 겪었던 문제가 무엇이었나요? 클론코딩에서 설정파일도 클론하지 않고.. 로컬에 있는거 복사하면 안되었다.. 시도 문제를 해결하기 위해 어떤 시도를 하셨나요? 멘토링 때 물어보았다. 해결 문제를 어떻게 해결하셨나요? 로그를 보면서 도커, 윈도우와 맥차이, mysql와 mariadb에 대해 고찰해 보았다. 알게된 것 문제를 해결하기 위해 시도하며 새롭게 알게된 것은 무엇인가요? db에 따라서 달리 설정해야 할 것이 있다. 윈도우와 맥의 경우 호환설정을 고려해야 할 부분이 있을 수 있다. 지난 목표 회고 지난 주에 설정해두었던 목표는 달성하셨나요? 잘된 것은 무엇이고 안된 것은 무엇인가요? 음.. 커피숍은 클론으로 완성했으나..

WIL 장애대응

*문제 이번 주차를 지나며 겪었던 문제가 무엇이었나요? redis fargate 사용문제 *시도 문제를 해결하기 위해 어떤 시도를 하셨나요? redis를 fargate에서 궂이 써야 되나... 생각하다.. 코치진들의 의견이 다르고, 각각의 전제 pk key 가 달라서 고민했다. *해결 문제를 어떻게 해결하셨나요? db index만 줬다. *알게된 것 문제를 해결하기 위해 시도하며 새롭게 알게된 것은 무엇인가요? 이걸 왜하는지 생각해본다. 장애대응은 장애가 생겼을때를 대비하기 위한 것이다. CloudWatch에 error로그가 찍혔거나, CPU,Memory 용량이 비정상일 때 슬랙에 지속적인 자동알람이 오게 만들어 놨는데 장애인지가 빨라야 해결이 빠를 수 있다. 이런 시스템을 구축해 놓으면 혹여나 있을수 ..

장애대응 WIL

- 문제 이번 주차를 지나며 겪었던 문제가 무엇이었나요? 장애대응에 관해서... 성능향상에 관해서 너무 추상적이었다. - 시도 문제를 해결하기 위해 어떤 시도를 하셨나요? 이것 저것 물어봤는데 그것보다 내실있게 TDD를 더 강화했고, 아티클을 봤다. 29CM 의 이굿위크 장애대응 기록. 이굿위크란? | by Greg Lee | Jan, 2024 | Medium 29CM 의 이굿위크 장애대응 기록이굿위크란?medium.com - 해결 문제를 어떻게 해결하셨나요? 팀원들과 이야기하면서 장애대응과 성능향상을 위해서 AutoScaling, DB ScaleUP, redis 이야기가 나왔다. 멘토링 시간에 물어보니 AutoScaling 의 ScaleOut 과 DB ScaleUp은 모두 비용이 야기되니 배제하고 re..

모니터링 WIL

1. 문제 이번 주차를 지나며 겪었던 문제가 무엇이었나요? DB연결과 CloudWatch 모니터링이 안되었다. 2. 시도 문제를 해결하기 위해 어떤 시도를 하셨나요? 계속 ECS를 84번까지 만든것 같다.. 3. 해결 문제를 어떻게 해결하셨나요? CloudWatch는 죽은 서비스를 모니터링하고 있었고, DB는 utf-8과... 소스 보니.. Entity를 수정했다. 4. 알게된 것 문제를 해결하기 위해 시도하며 새롭게 알게된 것은 무엇인가요? 1) 멘토의 도움은 확실히 크다. 2) 처음에 너무 이것저것 많이 하려고 하면 가다가 꼬인다. 차곡 차곡 해야 한다. 5. 지난 목표 회고 지난 주에 설정해두었던 목표는 달성하셨나요? 잘된 것은 무엇이고 안된 것은 무엇인가요? 1) 모니터링에 관한 튜토리얼이 친절하..

[장애대응 시나리오] JMeter 모니터링

선행조건 : JMeter 설치( https://jmeter.apache.org/ )및 plugin설치( Install :: JMeter-Plugins.org) 테스트 계획에 쓰레드 그룹 사용자 천명 (테스트계획-> 추가 -> 쓰레드들 -> 쓰레드그룹) HTTP 요청 생성 ( 서버IP, 포트번호, HTTP요청 방식 및 경로 설정, RequestBody 설정 (쓰레드그룹 -> 추가 -> 표본추출기 -> HTTP요청) 결과들의 트리보기 ( HTTP요청 모두 성공) (쓰레드그룹 -> 추가 -> 리스너 -> 결과들의 트리보기) 요약보고서( HTTP요청 ) (쓰레드그룹 -> 추가 -> 리스너 -> 요약보고서) => 오류 없고 표본 만개 최댓값 8929 총합보고서(HTTP 요청) (쓰레드그룹 -> 추가 -> 리스너 ..

TDD와 Junit5 정리

[10분 테코톡] 🌊 바다의 JUnit5 사용법 (youtube.com) //@BeforeAll 모든 테스트 메서드 실행전에 딱한번 //@AfterALL 모든테스트 메서드 실행후에 딱한 번 //@BeforeEach 각각의 테스트 메서드 실행전에 //@AfterEach 각각의 테스트 메서드 실행후에 //@Disabled 해당 테스트 메서드를 실행하지 않음 //@RepeatedTest(10) 해당 테스트 메서드를 10번 반복 실행 //@parameterizedTest 테스트 메서드를 반복 실행하면서 다른 값을 넣어줄 수 있음 //@Nested 테스트 클래스 안에 테스트 클래스를 만들어서 테스트를 그룹화 할 수 있음 //Assertions 결과 // assertAll 모든 테스트를 실행하고 결과를 한번에 확인..