전체 글

전체 글

    [JPA] 연관 관계

    단방향 연관 관계 @Entity public class Member { private Long id; @Column(name = "USERNAME") private String name; @ManyToOne @JoinColumn(name = "TEAM_ID") private Team team; } @Entity public class Team { @Id @GeneratedValue private Long id; private String name; } 객체 지향적으로 모델링을 하면 Member에는 TEAM_ID가 아니라 TEAM 참조값을 그대로 가지게 된다. 내가 속하는 팀 그 자체를 가지는 것이다. Team team = new Team(); team.setName("TeamA"); em.persist(..

    [JPA] Entity 매핑

    객체와 테이블 매핑 @Entity JPA가 관리하는 객체를 Entity라고 한다. JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 어노테이션을 필수로 달아줘야 한다. 파라미터가 없는 public 또는 protected생성자를 필수로 구현해야 하며 final 클래스, enum, interface, inner클래스에 사용할 수 없다. 그리고 DB에 저장할 필드에도 final을 사용할 수 없다. name 속성 JPA에서 사용할 Entity의 이름을 지정한다. 기본값으로 클래스 이름을 그대로 사용한다. 같은 이름이 있는게 아니라면 가급적 기본값을 사용하도록 한다. @Table Entity와 매핑할 테이블을 지정한다. name 속성 매핑할 테이블 이름을 지정한다. 실제 쿼리도 name에 지정된 테이블로 ..

    [JPA] 개념 정리(영속화, 영속성 컨텍스트)

    여태 spring-boot-starter-data-jpa 가 JPA의 전부인 줄 알았지만 아니었다. Java에서 대표적인 ORM이 JPA이고(표준이 되었음) 그 구현체 Hibernate가 있는 것과 객체는 객체답게, RDB는 RDB답게 설계하면 ORM 프레임워크가 자동으로 매핑해주는 것, DB에 종속적이지 않은 것 등은 알고 있었다. 그래서 JPA가 뭔지 더 찾아보니 기존에 내가 사용하던 것들의 원리를 알 수 있었다. JPA의 원리 JPA 동작 JPA는 어플리케이션과 JDBC 사이에서 동작한다. 어플리케이션에서 JPA로 명령을 하면 JPA가 해석해서 JDBC API를 사용하여 SQL을 실행하고 그 결과를 반환받는다. 그래서 findAll()과 같은 자바스러운 메소드를 사용해도 변환해서 SELECT * ~..

    [Java] 가비지 컬렉션(Garbage Collection)과 5가지 알고리즘

    가비지 컬렉션(Garbage Collection) 최근 친구가 전화로 자바에서 생긴 메모리 이슈 관련 도움을 구한 적이 있었다. 친구랑 같이 원인을 찾다 보니 계속 새로운 객체를 생성하여 참조된 객체를 Garbage Collection이 제거하지 않아 생기는 문제일 수 있음을 알게 되었다. 이런 것을 방지하기 위해 싱글톤 패턴으로 코드를 작성하고 Spring에 와서는 Bean을 생성하고 DI를 적용하여 자동으로 싱글톤 패턴이 적용되었다. 그래서 항상 하던 대로 코드를 작성하다 보니 Garbage Collection을 신경 쓰지도 않았고 어떻게 동작하는지도 몰라서 궁금하여 찾아보고 정리하게 되었다. 특히 나도 나중에 저런 메모리 이슈가 생길 수 있고 지금 공부하는 내용이 도움이 될 것 같다고 생각된다. G..

    [Java] 불변 객체와 final을 사용해야 하는 이유(feat.정적 팩토리 메소드)

    불변 객체(Immutable Object) 불변 객체란? 말 그대로 변하지 않는 객체로 객체 생성 이후 내부의 상태가 변하지 않는 객체를 의미한다. 불변 객체는 읽기만 가능하고 내부 상태를 제공하지 않거나 방어적 복사를 통해 제공한다. Java에서 대표적인 불변 객체로는 String이 있다. 불변 클래스이기 때문에 아래와 같이 char형 배열로 받아서 수정해도 바뀌지 않는다. String test = "Test"; char[] testArray = test.toCharArray(); testArray[0] = 'B'; System.out.println(test); System.out.println(Arrays.toString(testArray)); 방어적 복사란? 흔히 주소 값을 복사하는 얕은 복사와 전..

    로드밸런싱(Load Balancing)과 Nginx

    로드 밸런싱(Load Balancing) 로드 밸런싱이란? 말 그대로 서버가 처리할 일이나 요청(Load)을 여러 대의 서버로 분산(Balancing) 처리하는 것을 의미한다. 사전적인 정의로는 둘 이상의 중앙처리장치 또는 저장장치와 같은 컴퓨터 자원들에게 작업을 나누는 것을 의미한다. 한 대의 서버로 모든 부하가 집중되지 않도록 트래픽을 적절히 관리해서 각각의 서버가 최적의 퍼포먼스를 낼 수 있도록 하는 것이 목적이다. 서비스 규모가 커지고 사용자 수가 늘어날수록 트래픽이 증가하기 때문에 기존의 서버로는 원활한 서비스 운영이 불가능하게 된다. 이에 대처하는 방식이 크게 두 가지가 있다. 기존의 서버 성능을 확장하는 Scale-up 방식 서버의 개수를 늘리는 Scale-out 방식 Scale-up의 경우..

    REST? REST API? Restful API?

    REST REST란? REST는 Representational State Transfer의 약자로 자원을 이름(자원의 표현)으로 구분하여 해당 자원의 상태(정보)를 주고받는 모든 것을 의미한다. 자원의 표현 자원 : 해당 소프트웨어가 관리하는 모든 것( Ex. 문서, 그림, 데이터 등) 자원의 표현 : 그 자원을 표현하기 위한 이름 ( Ex. DB의 사용자 정보가 자원이면 ‘users’를 자원의 표현으로 정하는 것) 상태(정보) 전달 데이터가 요청되는 시점에서 자원의 상태(정보)를 전달하며 JSON을 통해 데이터를 주고받는 것이 일반적이다. 구체적인 개념으로 HTTP URI를 통해 자원(Resource)을 명시하고 HTTP Method(GET, POST, PUT, DELETE, PATCH 등)를 통해 해..

    쿠키와 세션 특징 및 차이

    쿠키와 세션을 사용하는 이유 HTTP 프로토콜의 약점을 보완하기 위해서 사용한다. HTTP 프로토콜은 다음과 같은 과정을 거친다 client가 server에 요청을 보낸다. server는 요청에 대한 처리 후에 client에 응답을 보낸다 응답 후 연결을 해제한다 여기서 문제가 생기는데 응답 후 연결을 해제한다는 것은 stateless 하다는 것이고 연결을 유지해야 하는 상태에서 문제가 발생한다. 예시로는 로그인 정보로 로그인을 유지해야 하는 경우이다. 만약 쿠키와 세션을 사용하지 않는다면 쇼핑몰에서 무언가를 구매하기 위해 로그인을 했음에도 페이지를 이동할 때마다 로그인을 해야 하는 문제가 생긴다. 이를 보완하기 위해 쿠키와 세션을 사용한다. 쿠키(Cookie) 쿠키란? 서버에서 사용자의 컴퓨터(클라이언..