배경 어떤 상황에서 일을 하든 소비자 요구사항은 항상 바뀐다. 변화하는 요구사항은 소프트웨어 엔지니어링에서 피할 수 없는 문제다. 이렇게 시시각각 변하는 사용자 요구사항에 어떻게 대응해야 할까? 특히 우리의 엔지니어링적인 비용이 가장 최소화될 수 있으면 좋을 것이다. 그뿐 아니라 새로 추가한 기능은 쉽게 구현할 수 있어야 하며 장기적인 관점에서 유지보수가 쉬워야 한다. 동작 파라미터화(behavior paramterization)를 이용하면 자주 바뀌는 요구사항에 효과적으로 대응할 수 있다. 동작 파라미터화란 아직은 어떻게 실행할 것인지 결정하지 않은 코드 블록을 의미한다. 이 코드 블록은 나중에 프로그램에서 호출한다. 즉, 코드 블록의 실행은 나중으로 미뤄진다. 변화에 대응하는 코드를 구현하는 것은 어..
프로젝트 설명 프로젝트 기간 : 2022년 10월 10일 ~ 2022년 11월 25일 역할 : backend, devOps 활용 기술 : Spring, MySQL, Spring data JPA, QueryDSL, Jenkins, AWS Youtube Shorts, Instagram, TikTok 과 같은 SNS 들은 컨텐츠 소비는 사용자 친화적이지만 컨텐츠를 생산하는 데는 장벽이 있습니다. Qhoto는 관리자가 사용자들에게 SNS에 올릴 컨텐츠를 제공함으로써 생산자와 동시에 소비자가 될 수 있도록 합니다. 동시에 매일 똑같은 하루를 보내는 사람들에게 환경, 건강, 봉사 등 사회에 이로운 퀘스트를 줌으로써 사회공헌과 함께 지루한 일상에 재미 포인트를 줄 수 있는 경험을 제공합니다. github : http..
Runtime Data Area 런타임 데이터 영역(Runtime Data Area)은 실제 클래스 파일이 적재되는 곳으로 JVM이 OS로 부터 자바 프로그램 실행을 위한 데이터와 명령어를 저장하기 위해 할당받는 메모리 공간이다. 메소드 영역 가장 먼저 데이터가 저장됨 클래스 로더에 의해 로드된 클래스, 메소드 정보와 클래스 변수 정보 저장 클래스 변수 남발 시 메모리 공간 부족할 수 있음 Java 7의 경우 부족할 수 있었으나 Java 8부터는 개선됨 프로그램 시작부터 종료될 때까지 메모리에 적재 명시적 null 선언 시 GC가 청소 모든 스레드가 공유함 힙 영역 런타임 시 결정되는 참조 자료형이 저장됨 런타임 시 결정됨에 따라 동작 중의 문제(범위 초과 참조 등)가 발생할 코드임에도 문법의 문제는 아..
JPA를 사용하는데 가장 중요한 일은 엔티티와 테이블을 정확히 매핑하는 것이다. JPA는 다양한 매핑 어노테이션을 지원하는데 크게 4가지로 분류할 수 있다. 객체와 테이블 매핑 : @Entity, @Table 기본 키 매핑 : @Id 필드와 컬럼 매핑 : @Column 연관관계 매핑 : @ManyToOne, @JoinColumn 객체와 테이블 매핑 @Entity JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 어노테이션을 필수로 붙여야한다. 속성 name : JPA에서 사용할 엔티티 이름을 지정한다. 보통 기본값인 클래스 이름을 사용한다. 만약 패키지에 이름이 같은 엔티티 클래스가 있다면 이름을 지정해서 충돌하지 않도록 해야 한다. 주의사항 기본 생성자는 필수다(파라미터가 없는 public 또는..
플러시 플러시(flush())는 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영한다. 영속성 컨텍스트를 플러시 하는 방법은 3가지다. em.flush()를 직접 호출한다. 엔티티 매니저의 flush() 메소드를 직접 호출해서 영속성 컨텍스트를 강제로 플러시 한다. 테스트나 다른 프레임워크와 JPA를 함께 사용할 때를 제외하고 거의 사용하지 않는다. 트랜잭션 커밋 시 플러시가 자동 호출된다. 데이터베이스에 변경 내용을 SQL로 전달하지 않고 트랜잭션만 커밋하면 어떤 데이터도 데이터베이스에 반영되지 않는다. 따라서 트랜잭션을 커밋하기 전에 꼭 플러시를 호출해서 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영해야 한다. JPA는 이런 문제를 예방하기 위해 트랜잭션을 커밋할 때 플러시를 자동으로 호출한다. ..
엔티티 조회 영속성 컨텍스트는 내부에 캐시를 가지고 있는데 이것을 1차 캐시라 한다. 영속 상태의 엔티티는 모두 이곳에 저장된다. 쉽게 이야기하면 영속성 컨텍스트 내부에 Map이 하나 있는데 키는 @Id로 매핑한 식별자고 값은 엔티티 인스턴스다. //엔티티를 생성한 상태 (비영속) Member member = new Member(); member.setId("member1"); member.setUsername("회원1"); //엔티티를 영속 em.persist(member); 이 코드를 실행하면 다음과 같이 1차 캐시에 회원 엔티티를 저장한다. 회원 엔티티는 아직 데이터베이스에 저장되지 않았다. 이번에는 엔티티를 조회해보자. Member member = em.find(Member.class, "memb..
엔티티 매니저 팩토리와 엔티티 매니저 엔티티 매니저는 엔티티를 저장하고, 수정하고, 삭제하고, 조회하는 등 엔티티와 관련된 모든 일을 처리한다. 이름 그대로 엔티티를 관리하는 관리자다. 데이터 베이스를 하나만 사용하는 애플리케이션은 일반적으로 EntityManagerFactory를 하나만 생성한다. 다음은 엔티티 매니저 팩토리를 생성하는 코드다. //공장 만들기, 비용이 아주 많이 든다. EntityManagerFactory emf = Persistence.createManagerFactory("jpabook"); 이제는 필요할 때마다 엔티티 매니저 팩토리에서 엔티티 매니저를 생성하면 된다. //공장에서 엔티티 매니저 생성, 비용이 거의 안든다. EntityManager em = emf.createEnt..
JPA란? JPA는 자바 진영의 ORM 표준 기술이다. JPA는 애플리케이션과 JDBC 사이에서 동작한다. ORM(Object-Relational Mapping)은 이름 그대로 객체와 관계형 데이터베이스를 매핑한다는 뜻이다. ORM 프레임워크는 객체와 테이블을 매핑해서 패러다임의 불일치 문제를 개발자 대신 해결해 준다. 따라서 객체 측면에서는 정교한 객체 모델링을 할 수 있고 관계형 데이터베이스는 데이터베이스에 맞도록 모델링하면 된다. 그리고 둘을 어떻게 매핑해야 하는지 매핑 방법만 ORM 프레임워크에게 알려주면 된다. 덕분에 개발자는 데이터 중심인 관계형 데이터베이스를 사용해도 객체지향 애플리케이션 개발에 집중할 수 있다. JPA는 자바 ORM 기술에 대한 API 표준 명세다. 쉽게 이야기해서 인터페이..