Develop(13)
-
1+N
1+N은 왜 일어나는가? 기본 정의: N+1 문제는 ORM(Object-Relational Mapping)을 사용할 때 발생하는 퍼포먼스 문제하나의 쿼리로 N개의 객체를 로딩한 후, 각 객체에 연관된 데이터를 추가로 조회하는 개별 쿼리가 N번 실행되면서 총 N+1번의 쿼리가 발생하는 문제아니 그냥 하나만 추가되는건데 문제가 생기는거야??ㅇㅇ N+1 문제는 단순히 "하나의 쿼리가 더 실행된다"는 문제가 아니라, 시스템의 확장성과 성능에 심각한 영향을 미칠 수 있는 구조적 문제요청이 동시에 여러 사용자로부터 발생한다면, 데이터베이스는 수백,수천,수만개의 쿼리를 추가 처리! 이런 코드는 절대 짜면 안되지만 이해를 쉽게하기 위한 예시!이런거 짜면 하루종일 시니어 개발자한테 혼납니다.public void prin..
2025.03.12 -
Proxy가 도대체 뭔데
프록시라는 개념은 추상적으로는 이해가 가는데 눈에 보이질 않으니 잘 와닿지가 않았다. 제대로 정리해보자. 프록시는 대리인(대신 처리하는 사람) 이라고 생각하면 된다.즉, "어떤 객체(실제 객체)를 직접 호출하는 것이 아니라, 중간에서 대신 처리해주는 객체" 라는 뜻이다. 프록시를 다음과 같이 비유를 들어보자. 영화배우와 매니저한 영화배우(실제 객체)가 있어.하지만 배우는 너무 바빠서 기자 인터뷰 요청을 직접 받지 않고, 매니저(프록시 객체)를 통해서만 스케줄을 조정해.매니저는 배우의 인터뷰 일정을 조율하고, 필요하면 취소하거나 조정하는 역할을 해.프록시의 역할인터뷰를 요청하면, 배우가 직접 받는 것이 아니라 매니저가 대신 받고 필터링해.매니저가 "이 인터뷰는 안 되겠는데요"라고 하면 인터뷰가 진행되지 않..
2025.03.11 -
ORM은 왜 생겨났는가? JDBC부터 ORM까지 여정
ORM이 생겨나게되기까지의 이야기를 정리해보자. Database Driver먼저 데이터베이스 드라이버에 대한 이야기부터 해야한다.데이터베이스 드라이버란 DB와 어플리케이션 간 통신을 중걔하는 것이다. 어플리케이션의 요청을 DB가 이해할 수 있는 언어로 변환해준다.다양한 DB가 있고 DB마다 호환되는 드라이버가 따로 있다. 그럼 드라이버는 어떻게 동작되나? JDBC Manager가 런타임 시점에 1. getConnection() -> 드라이버에 연결 요청2. createStatement() -> 어플리케이션의 요청을 SQL 명령으로 변환해서 statement를 생성3. executeQuery() -> DB가 쿼리를 처리하고 ResultSet을 만들어서 드라이버에게 넘겨줌4. close() -> 연결을 종..
2025.03.11 -
일정관리 앱 트러블 슈팅
1. 날짜 변수 자료형작성일과 수정일은 날짜로 저장해야하는 자료형이다. 처음에는 자바에서 날짜로 된 자료형을 다루려면 어떻게 해야하는지 몰랐다. 그래서 인텔리제이 탭키로 날짜관련 자료형을 찾아보니 LocalDateTime이라는 자료형이 있어서 무턱대고 그걸 사용했었다. 그랬더니 내가 원하는 형식은 년도-달-일 형식의 날짜까지만 나오는 형식이었는데 응답받은 json을 보니 시간과 초까지 저장되어 있었다. 그래서 이를 해결하기 위해 @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd") private LocalDateTime createdAt; @JsonFormat(shape = JsonFormat.Shape.STRING,..
2025.02.04 -
Spring에서 서버와 클라이언트 통신방식 정리 2025.01.27
-
static 키워드와 반복문 밖에서 객체 생성, 널세이프
계산기 과제 해설 세션을 들으며 내가 배우고 깨달았 던 점을 정리해보았다! 1. 반복문 밖에서 객체 생성의 중요성코드를 작성하는 과정에서 나의 문제점은 계산 결과가 리스트에 지속적으로 쌓여야 하는데 그렇지 않았다는 점이다. 그래서 내가 추론한 과정은 이러하다.App클래스에서 계산을 수행할 때 while 무한반복문을 돌며 계속 객체를 새로 생성하는 것 같다. -> 각기 다른 객체가 만들어지고 객체마다 메모리 주소가 다른 ArrayList를 참조하고 있을 것이다. -> 때문에 한 개의 ArrayList에 여러객체의 계산 결과값이 공유되어 있지 않다. -> 그렇다면 이 ArrayList를 인스턴스멤버가 아닌 클래스멤버로 바꾸자! -> static 키워드를 이용하자. 였다. 그래서 나는 ArrayList를 st..
2025.01.14