우선 Test의 의미 자체만 생각해보자! 무엇을 테스트해야 하는가? "그 기능에 대한 값을 넣었을 때, 그 기능이 성공적으로 작동하느냐" 를 테스트해봐야지 내가 작성한 updateProfile() 기능을 테스트한다면 무엇을 테스트해봐야 할까. 1. 업데이트가 잘 되는지 확인. - 잘 된다는 건, 정상적인 값이 들어오고, 실제로 데이터베이스의 값이 바뀐다거나 그런 것들을 확인해야 하고, - 업데이트가 안 되는 상황도 확인해야 한다 여기서는 두 가지를 확인해봐야지 1) 사용자가 이미 있어서 업데이트가 완료되었다는 말이 나오거나 2) 사용자가 없어서 예외 메시지가 터진다거나 일단 UserService 인터페이스와 UserServiceImpl 클래스의 테스트 할 내 부분 원본 코드를 가져와보자. UserServ..

JPA는 귀찮은 작업들을 처리해주는 편리한 도구. 예를 들면, 지금 코드에 있는 Product라는 것도 관계형 데이터베이스에 있는 하나의 row인데 쿼리를 직접 짤 필요 없이 객체 단위로 저장을 하거나 조회를 하고, 객체 째로 주면 jpa가 알아서 Insert 쿼리를 날려주고, 조회를 한다고 하면 그 row를 다시 객체로 변환하는 귀찮은 작업들을 도와주는 것도 맞다. "패러다임 불일치" 데이터베이스에서 보는 객체는 하나의 row인데, 객체에서는 하나의 클래스(다름) 이 부분을 자동 변환을 통해 해결해줌. 그런데 이러한 작업을 하려면, 적어도 "데이터베이스에 있는 이 row는 클래스와 어떻게 매핑이 될 거야" 라고 하는 최소한의 정보는 줘야 해. 그게 이제 "매핑 관계 설정" 이 되는 거지. @Entity..
엔티티 매핑 관련 어노테이션 어노테이션 설명 @Entity 클래스를 엔티티로 선언 @Table 엔티티와 매핑할 테이블을 지정 @Id 테이블의 기본키에 사용할 속성을 지정 @GenerateValue 키 값을 생성하는 전략 명시 @Column 필드와 컬럼 매핑 @Lob BLOB, CLOB 타입 매핑 @CreationTimestamp insert 시 시간 자동 저장 @Enumerated enum 타입 매핑 @Transient 해당 필드 데이터베이스 매핑 무시 @Temporal 날짜 타입 매핑 @CreateDate 엔티티가 생성되어 저장될 때 시간 자동 저장 @LastModifiedDate 조회한 엔티티의 값을 변경할 때 시간 자동 저장 BLOB, CLOB의 의미 - CLOB이란 사이즈가 큰 데이터를 외부 파일..

* 영속성 컨텍스트는 애플리케이션과 데이터베이스 사이에 있는 중간 계층이다. - 이렇게 중간 계층을 만들면 버퍼링, 캐싱 등을 할 수 있다. 1차 캐시 - 영속성 컨텍스트에는 1차 캐시가 존재하며 Map 로 저장된다. - entityManager.find() 메소드 호출 시 영속성 컨텍스트의 1차 캐시를 조회한다. - 엔티티가 존재할 경우 해당 엔티티를 반환하고, 엔티티가 없으면 데이터베이스에서 조회 후 1차 캐시에 저장 및 반환한다. 동일성 보장 - 하나의 트랜젝션에서 같은 키값으로 영속성 컨텍스트에 저장된 엔티티 조회 시 같은 엔티티 조회를 보장한다. - 이는 1차 캐시에 저장된 엔티티를 조회하기 때문에 가능하다. 트랜젝션을 지원하는 쓰기 지연 - 영속성 컨텍스트에는 쓰기 지연 SQL 저장소가 존재한..

엔티티 (Entity) : 엔티티란 데이터베이스의 테이블에 대응하는 클래스이다. @Entity가 붙은 클래스는 JPA에서 관리하며 엔티티라고 한다. 데이터베이스에 item 테이블을 만들고 이에 대응 되는 item 클래스를 만들어서 @Entity 어노테이션을 붙이면 이 클래스가 엔티티가 되는 것. 클래스 자체나 생성한 인스턴스도 엔티티라고 부른다. 엔티티 매니저 팩토리 (Entity Manager Factory) : 엔티티 매니저 인스턴스를 관리하는 주체 - 애플리케이션 실행 시 한 개만 만들어지며 사용자로부터 요청이 오면 엔티티 매니저 팩토리로부터 엔티티 매니저를 생성한다. 엔티티 매니저 (Entity Manager) : 영속성 컨텍스트에 접근하여 엔티티에 대한 데이터베이스 작업을 제공한다. - 내부적으..

Entity Post TimeStamped @Entity @Getter @NoArgsConstructor public class Post extends TimeStamped { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String title; private String writer; private String password; private String content; // public Board() {} // 기본 생성자는 반드시 있어야 한다. public Post(String title, String writer, String password, String content) { this.title = tit..
Entity Post @Entity @Getter @NoArgsConstructor public class Post extends TimeStamped { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String title; private String writer; private String password; private String content; // public Board() {} // 기본 생성자는 반드시 있어야 한다. public Post(String title, String writer, String password, String content) { this.title = title; this.wri..
Spring 입문 주차 개인 과제 🏁 Goal: "스프링 부트로 로그인 기능이 없는 나만의 항해 블로그 백엔드 서버 만들기" 학습 과제를 끝내고 나면 할 수 있어요! Java를 활용하여 필요한 클래스를 구상할 수 있어요. Lombok과 JPA를 이용하여 원하는 데이터베이스를 만들고 활용할 수 있어요. Spring Boot를 기반으로 CRUD(Create, Read, Update, Delete) 기능이 포함된 REST API를 만들 수 있어요. 🤔 notification : 과제 주의사항 entity를 그대로 반환하지 말고, DTO에 담아서 반환해주세요! 프론트엔드와 백엔드가 느슨하게 결합하는 환경이 ”최근에는” 더 일반적이라고 말씀드렸죠? 앞으로 남은 강의 예제와 실습에서는 html/css/js 즉 뷰도..