전체 글 56

지연 로딩과 즉시 로딩의 차이

즉시 로딩: 연관관계에서 1:N 관계에 있는 엔티티를(N쪽의 데이터를) 조회할 때, 거기에 매핑된 다른 엔티티도 한 번에 하나의 쿼리로 가져오는 방식지연 로딩: DB가 아닌 프록시에서 데이터를 가져온다. 마찬가지로 N 쪽의 데이터를 조회할 때, 해당 데이터는 실제 DB쿼리로 가져오고 매핑된 다른 엔티티들은 프록시 객체로 함께 생성되어 메모리에 로딩됨. (프록시 객체는 즉시 생성되지만 그 프록시 내부의 실제 데이터는 아직 로딩되지 않음) 예를 들어보자...@Entitypublic class MemberPrefer { @ManyToOne(fetch = FetchType.LAZY) private Member member;}MemberPrefer이라는 객체에 N:1관계로 매핑된 객체 member 즉시..

궁금한 것 2025.05.08

[투두메이트 프로젝트] 공통 응답(Response) 객체 만들기

4/9 작성 투두메이트 프로젝트를 진행하던 중, 요청을 보냈을 때 성공이든 실패든 너무 단순한 응답만 받으니 직접 로그를 확인하는 등 디버깅에 불편을 느꼈다.에러가 나면 항상 같은 에러 메세지만 출력되고, 어떤 문제가 발생했는지 알기 위해선 로그를 직접 뒤져야 했다.요청이 성공해도 200OK만 떠서, 어떤 요청이 성공한 건지 명확하지 않았다. 혼자 개발하는데도 이렇게 불편한데, 협업 환경에서는 더 불편하겠다 싶었다. 남이 짠 코드를 테스트하거나 디버깅할 때 불필요하게 시간을 낭비하게 될 것 같다는 생각이 들었다...그래서 응답 객체를 통일해서 클라이언트와 서버 간의 소통을 더 명확히 하자는 생각이 들었다.이 글에서는 그렇게 만들게 된 공통 응답 Response 객체에 대해 정리해보겠다. 기존 postma..

토이프로젝트 2025.05.02

투두메이트 클론코딩 중, Todo의 status 기본값 설정 방법

투두메이트 클론 코딩 중, 새로운 todo를 만들 때 status 필드의 기본값을 설정해줘야 할 일이 생겼다. todo(할 일)의 status는 보통 PENDING(미완료)로 시작한다.이 기본값을 어디서 정해주는 게 좋은 방식일 지 고민하게 됐다.DB 테이블 생성 시 해당 필드에 default 설정 해주기Java 엔티티에서 변수 선언 시 기본값 설정하기생성자에서 기본값 설정하기Builder에서 기본값 설정하기 (@Builder + @Builder.Default)각 방법을 하나씩 살펴보자.1. DB 테이블 생성 시 해당 필드에 default 설정 해주기위처럼 todo 테이블을 생성할 때 status의 기본값을 pending으로 설정해주는 방식이다.DB에서 자동으로 기본값을 설정해 주지만,Java에서 생성되..

궁금한 것 2025.04.05

[투두메이트 클론코딩] ERD 및 주요 기능

주요 기능홈 화면 (피드)캘린더 기능월/주 단위로 보기 가능각 날짜에 남은 할 일 개수 표시수행 완료 여부에 따라 색깔 표시루틴은 흐리게 표시 → 클릭 시 오늘 할 일로 등록투두 추가투두 캘린더가 아닌 일반 캘린더로 보여주는 기능투두 관련 기능카테고리별 투두 표시 (색상 지정)각 투두에 대한 기능:수정 / 삭제메모 작성알림 설정 (알림 보내주는 기능도 추후 연결)타이머 열기오늘로 날짜 이동날짜 변경루틴 수정보관함으로 이동완료한 투두에 대해 사진 인증, 오늘 또하기, 다른날 또하기 버튼 생성투두 카테고리, 순서 변경친구 관련홈 화면 상단에 친구 목록 표시친구 클릭 시 친구의 할 일 확인 가능채팅채팅방 생성 (단체 가능)채팅 기능읽음 표시카테고리카테고리 등록 / 종료 / 삭제색상 설정공개 범위 설정둘러보기계..

토이프로젝트 2025.04.05

[SpringBoot] 연관관계

객체끼리 협업하게 코딩하자. 좀 더 객체지향적으로!연관관계? 객체와 객체 사이의 관계를 의미하며, 이를 데이터베이스의 테이블 간 관계와 매핑하는 것 예시) 도서관에서, 사용자(User)와 대출 기록(UserLoanHistory) 객체는 서로 연관 관계에 있기 때문에, 이 두 객체를 Service가 모두 다루게 하지 않고, 서비는 User 객체만 다루고, 이 두 객체끼리 서로 협업하게 하여 User 객체 안에서 UserLoanHistory 객체를 다루게 하는 것이 좀 더 객체지향적인 코드 선행 조건두 협업하는 객체가 서로를 알아야 한다.UserLoanHistory 객체 안의 요소로 User를 선언이때 JPA에게, 이 User라는 요소가 테이블의 어느 필드에 해당하는 지 알려줘야 함.두 객체에게 서로를 알려..

스프링부트 2025.03.15

[SpringBoot] Transaction 트랜잭션

서비스 계층의 역할비즈니스 로직을 갖는다여러 SQL에 접속하는 경우 트랜잭션 관리트랜잭션이란?쪼갤 수 없는 업무의 최소 단위"모든 작업이 성공해야 최종적으로 적용됨"을 보장모든 SQL을 성공시키거나, 하나라도 실패하면 모두 실패시킴 MySQL 트랜잭션 명령어(SQL)start transaction;트랜잭션 시작하기commit;트랜잭션 정상 종료 (트랜잭션 시작 후 실행된 모든 SQL 한번에 반영)rollback;트랜잭션 실패 처리 (트랜잭션 시작 후 실행된 모든 SQL 미반영) 실습트랜잭션 실행 후, 테이블에 값 저장. 이 상태에서 다른 MySQL 창에서 해당 테이블의 정보를 검색하면트랜잭션이 시작된 후 아직 commit이나 rollback으로 이 트랜잭션의 반영 여부를 알려주지 않았기 때문에, 다른 단..

스프링부트 2025.03.10

[SpringBoot] Spring Data JPA를 사용한 CRUD

Spring Data JPA v.s. JPASpring Data JPA는 복잡한 JPA 코드를 스프링과 함께 쉽게 사용하도록 도와주는 라이브러리위의 함수들은 복잡한 JPA 코드를 감싼 코드임 전체 틀Spring Data JPA: JPA 사용JPA는 규칙일 뿐이고, 이를 구현한 Hibernate가 코드 역할을 하며Hibernate는 내부적으로 jdbc를 사용한다. 그래서 우리는 Srping Data JPA를 사용하면서 JDBC를 사용하고 있는 것Service에서 JpaRepository를 상속받은 Repository의 함수를 이용해서 CRUD 기능을 구현해보자사용할 repository 클래스가 JpaRepository를 상속받게 하면, 해당 repository는 굳이 @Repository를 붙이지 않아도,..

스프링부트 2025.03.10

[SpringBoot][DB] JPA (이용 배경, 개념, table과 객체 맵핑 실습)

JPA 이용 배경JdbcTemplate을 사용해서, 개발자가 문자열로 저장한 sql을 JdbcTemplate을 이용하여 데이터베이스에 던져주는 식으로 진행했을 때의 한계1. 문자열을 개발자가 직접 작성: 실수할 수 있고, 실수 인지 시점이 느림문자열 내부에서 나는 이 오류는 컴파일 시점이 아닌 런타임 시점에 잡히기 때문.*런타임 시점 오류와 컴파일 시점 오류에 대해서는 아래 글을 참고하세요https://mim-doremi.tistory.com/542. 특정 데이터베이스에 종속적이게 됨데이터베이스를 변경하고자 할 때, 작성했던 레포지토리 클래스를 하나하나 찾아가서 바꿔줘야 함.3. 반복 작업이 많아짐테이블 하나 생성 시 기본적으로 CRUD가 항상 필요한데, 이 쿼리들을 항상 작성해줘야 한다.4. 데이터베이..

스프링부트 2025.03.09

[Java] 런타임 시점 오류 v.s. 컴파일 시점 오류

컴파일 시점: 서버를 실행하는 순간 (.java 코드를 .class코드로 변환시켜 JVM에 동작시키는 과정을 컴파일이라했지)런타임시점: 실제 서버가 동작하고 나서(가동되고 나서)를 의미오류가 날거라면 서버 동작 중 기능에 오류가 나는 것이 아니라, 서버가 아예 동작하지 않아서 사전에 어떤 오류가 났는 지 아는 것이 훨씬 용이추후 보강 예정입니다.

자바 공부 2025.03.09

[SpringBoot] Spring Container

스프링 컨테이너란스프링 애플리케이션의 핵심 구성 요소로, 애플리케이션에 사용되는 빈 객체를 관리하는 역할을 한다. 애플리케이션의 시작과 종료, 객체의 생성과 소멸, 의존성 주입 등을 처리스프링 컨테이너의 주요 역할1. 빈 관리스프링 애플리케이션의 객체(빈)을 생성하고, 그 생명 주기를 관리빈을 스프링 컨테이너에 등록하고, 필요한 곳에 주입하여 객체 간의 의존성 문제를 해결2. 의존성 주입 (Dependency Injection)빈 객체 간의 의존성을 자동으로 주입@Autowired, 생성자 주입, 세터 등을 사용하여 빈을 주입받을 수 있다.3. 빈 생명 주기 관리빈의 생성, 초기화, 소멸 관리.4. 스코프(Scope) 관리빈의 스코프 관리.5. 컴포넌트 스캔 (Component Scan)애플리케이션에서 ..

스프링부트 2025.03.09