JPA에서 가장 기본이 되는 연관관계 매핑 중 다대일과 일대다 매핑에 대해 알아보자. 먼저 아래 두 개의 클래스를 알아보자. Member@Entitypublic class Member { @Id @Column(name = "MEMBER_ID") private String id; private String username; @ManyToOne @JoinColumn(name = "TEAM_ID") // 외래 키 설정 private Team team; public void setTeam(Team team) { this.team = team; } // Getter, Setter ...} Team@Entitypublic class Team { ..
김영한 강사님의 강의를 듣고 실습을 하고 있었는데 member의 id가 50씩 늘어나는 문제를 확인했다. 이게 뭐였지 50개씩 할당을 미리 하는게 뭔가 있었던거 같은데 싶어서 찾아보니까 H2, PostgreSQL, Oracle 등에선 내부에서 SEQUENCE 전략을 사용하는데 성능 향상을 위해 기본적으로 ID 값을 한 번에 50개씩 미리 할당해준다는 사실을 다시 알았다. 아그래서 ID가 50씩 뛰던 것. @Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id; 이렇게 바꾸면 DB가 직접 auto_increment를 관리해서 ID가 1씩 증가한다. 근데 두 번째 문제가 발생했다. 전략 바꾸고 서버 실행 후 회원등록을 했는데 white..
스프링 부트 + JPA를 공부하다 보면 처음에는 마법 같던 기능들이실제로는 철저한 "영속성 컨텍스트" 기반에서 돌아간다는 걸 알게 된다. 이 글에서는 내가 JPA를 공부하면서 핵심적으로 정리했던 내용을 토대로 순차적으로 정리해보겠다. 1. 엔티티는 무엇인가?Entity란 JPA에서 가장 기본이 되는 단위로 데이터베이스의 테이블과 직접적으로 매핑되는 자바 객체를 의미한다. 예를 들어 우리가 회원 정보를 저장할 수 있는 테이블 MEMBER가 있다고 하면 이 테이블과 매핑되는 자바 클래스는 보통 Member라는 이름을 가질 거고 이 클래스는 @Entity라는 어노테이션을 통해 JPA가 "이건 DB랑 연결된 객체구나" 라고 인식하게 된다. 이렇게 선언된 엔티티는 단순히 필드를 정의해둔 데이터 저장용 객체를..
인덱스란? 인덱스는 데이터베이스에서 데이터를 빠르게 검색할 수 있도록 도와주는 구조이다. 대량의 데이터가 존재하는 경우 인덱스가 없으면 원하는 데이터를 찾기 위해 모든 데이터를 순차적으로 검색해야 하므로 시간이 많이 소요된다. 예를 들어 수천만 개의 레코드가 있는 데이터베이스에서 특정 조건에 맞는 데이터를 찾으려면 인덱스가 필수적이다. 인덱스는 검색 속도를 크게 향상시켜 주고 데이터베이스의 성능을 최적화하는 데 중요한 역할을 한다. 인덱스를 사용하면 무엇이 달라질까? 검색 속도가 획기적으로 빨라지게 된다. 수만 건 중 1건을 찾는데 0.001초 수준으로 찾을 수 있다. 자바 책을 샀다고 가정하자. "3장 - 객체 지향 프로그래밍"을 찾고 싶은데 인덱스가 없다면 책의 첫 페이지부터 1장,2장,3장 ..
HTTP 응답 메시지에 데이터를 어떻게 담아서 보낼까? 크게 나누면 두 가지 방식이 있다. 1. 문자열(String)을 응답으로 보내기 2. JSON 형태의 객체 응답(HelloData) 어떻게 점점 간결하고 편리한 방식으로 발전했는지 확인해보자. 코드는 김영한 선생님의 mvc패턴 강의자료에서 가져왔다. V1: 서블릿 HttpServletResponse 직접 사용 @GetMapping("/response-body-string-v1")public void responseBodyV1(HttpServletResponse response) throws IOException { response.getWriter().write("ok");} 자바 웹 개발의 전통적인 서블릿 API 방식이다.HttpServl..
스프링부트를 무턱대고 공부하면 방대한 지식에 좌절할 수 있다. 전체적인 구조가 어떻게 되는지 먼저 베이스로 알고 가야 이해가 잘 될 것이라고 생각한다. 웹 애플리케이션을 개발할 때 가장 중요한 것 중 하나가 "구조를 어떻게 설계할 것인가" 이다. 구조가 잘 설계되지 않으면 유지보수도 어렵고 확장성도 떨어지고 팀 개발 시 충돌이 많이 발생할 수 있다. 스프링부트에서는 계층형 아키텍처를 사용하여 이런 문제를 해결한다. 스프링부트의 4가지 주요 계층을 알아보고 실제 애플리케이션이 어떻게 동작하는지 이해해보자. 스프링부트의 4가지 주요 계층스프링부트의 계층 구조는 다음과 같이 나뉜다.Presentation Layer (프레젠테이션 레이어, Controller)→ 사용자의 요청을 받고 응답을 반환하는 계층Bus..
데이터베이스 설계에서 흔히 마주치는 문제 중 하나는 중복 데이터와 비효율적인 관리이다. DB의 세계를 맛보면서 정규화의 중요성을 공유하고자 한다. 온라인 쇼핑몰에서 고객의 주소 정보가 여러 테이블에 중복되어 저장되어 있다면? 여러 번 주문을 하면서 주소가 매번 반복적으로 저장된다면 데이터의 중복으로 인해서 저장 공간이 낭비되고 주소가 변경 될 때마다 모든 주문 정보를 수정해야 하는 번거로움이 발생할 수 있다. DB 정규화는 중복을 최소화하고 주소 정보는 한 곳에서만 관리되도록 구조를 개선하는 데 도움을 준다. 단순한 중복 제거 뿐만 아니라 데이터의 무결성과 관리의 용이성을 높이는 정규화는 꼭 필요하다. 단순히 DB 매핑과 저장 뿐 아니라 DB를 효율적이고 잘 관리하는 것이 백엔드 개발자의 주 업무이다. ..
이 사이트는 mermaid.live라는 사이트이다. Mermaid는 코드 기반의 다이어그램 생성 도구이다. 다양한 유형의 다이어그램을 손쉽게 작성할 수 있다. flowchart를 그릴 때 유리하고 코드로 작성하므로 수정과 관리가 편하다. 이제 Mermaid에 대해 알아보자. Mermaid가 뭐지? JavaScript로 작성된 라이브러리인 Mermaid는 Markdown 문서 내에서 다이어그램을 생성할 수 있게 해준다. 개발자들은 별도의 그래픽 도구 없이 코드로 다이어그램을 표현할 수 있다! Flowchart (순서도)Sequence Diagram (시퀀스 다이어그램)Gantt Chart (간트 차트)Class Diagram (클래스 다이어그램)Git Graph (깃 그래프)Entity Relatio..