전체 글 132

다양한 연관관계 매핑

연관관계 매핑 시 고려사항에는 3가지가 있다 다중성 (다대일, 일대다, 일대일, 다대다) 단방향, 양방향 테이블 외래 키 하나로 조인 가능 사실 방향이라는 개념이 없음 객체 참조용 필드가 있는 쪽으로 참조 가능 한쪽만 참조하면 단방향 양쪽이 서로 참조하면 양방향 (사실 단방향 2개) 연관관계의 주인 (양방향) 테이블은 외래키 하나로 두 테이블이 연관관계를 맺음 객체 양방향 관계는 A->B, B->A처럼 참조가 2군데 객체 양방향 관계는 참조가 2군데 있음. 둘 중 테이블의 외래 키를 관리할 곳을 지정해야 함 연관관계의 주인 : 외래 키를 관리하는 참조 주인의 반대편 : 외래 키에 영향을 주지 않음, 단순 조회만 가능 다대일 [N : 1] N이 연관관계 주인 단방향 DB입장에서 팀이 1이고 MEMBER가 ..

JPA 2023.08.29

연관관계 매핑, 단방향, 양방향

연관관계가 필요한 이유 예제 시나리오를 통해 알아보자 회원과 팀이 있다. 회원은 하나의 팀에 소속될 수 있다. 회원과 팀은 다대일 관계이다. 만약 연관관계가 없이 객체를 테이블에 맞추어 모델링을 하면 아래와 같이 된다. 이렇게 설계를 하게 되면 Member객체에 teamId 필드를 통해 Team을 참조해야 한다. 만약 멤버의 팀을 조회하려면 아래와 같은 코드를 수행해야 한다. //조회 Member findMember = em.find(Member.class, member.getId()); Team findTeam = em.find(Team.class, findMember.getTeamId()); 이런 코드는 객체 지향적인 방법이 아니다. 객체는 참조를 사용해서 객체를 찾고 테이블은 외래키로 조인을 사용해..

JPA 2023.08.28

엔티티 매핑, 기본 키 매핑

@Entity 객체와 테이블을 매핑하기 위해서 @Entity 애노테이션을 사용한다 @Entity 애노테이션을 사용하면 그 객체는 JPA가 관리한다. 관리되는 객체는 기본 생성자(파라미터가 없는)가 필수적으로 필요하다.(public, protected) 저장할 필드에 final을 사용하면 안 된다. final, enum, interface, inner 클래스에 사용이 불가하다. Entity 중 name에 대해 알아보자 JPA에서 사용할 엔티티 이름을 지정한다 디폴트 값은 클래스의 이름이다. 디폴트 값을 사용하는 것을 권장한다 ( 같은 이름의 클래스가 없을 때) @Table 엔티티와 매핑할 테이블을 지정한다. 기본 값으로는 엔티티의 이름을 사용한다. 기본 키는 @Id 애노테이션을 사용한다. 매핑애노테이션 정..

JPA 2023.08.27

JPA 설정 하기

JPA 설정은 persistence.xml 파일에 해야 한다 위 파일의 경로는 resources/META_INF에 만들어야 한다. persistence파일을 보자 주석 참고 // h2 디비 사용 // db아이디 //db 비밀번호 //db 주소 // JPA중에 H2방언을 사용한다 //sql 보기 // sql 형식으로 예쁘게 출력 // sql 설명 // 데이터 베이스 스키마 자동 생성 JPA는 특정 데이터베이스에 종속되지 않는다 데이터 베이스에 따라 SQL 문법과 함수가 조금씩 다르다 그래서 persistence파일에 dialect에 어떤 DB를 사용할지 설정해 주어야 한다. 옵션의 DDL 자동 설정 부분을 보자 이 부분은 DDL을 설정하는 코드이다 DDL을 애플리케이션 실행 시점에 dialect정보를 활용..

JPA 2023.08.26

영속성 컨텍스트

EntityManagerFactory와 EntityManager EntityManagerFactory는 고객의 요청이 들어올 때 마다 (thread가 생성될 때마다) EntityManager를 생성한다. EntityManager은 내부적으로 DB 커넥션 pool을 사용해서 DB에 접근한다. EntityManagerFactory JPA는 EntityManagerFactory를 만들어야 한다. application loading 시점에 DB당 딱 하나만 생성되어야 한다. WAS가 종료되는 시점에 EntityManagerFactory를 닫는다. ( 내부적으로 DB 커넥션을 반환한다. EntityManager Transaction 단위를 수행할 때마다 생성한다.(고객의 요청이 들어오면 생성 후 끝나면 닫는다.)..

JPA 2023.08.26

HTTP 메시지 컨버터

HTTP API처럼 JSON 데이터를 HTTP 메시지 바디에 직접 읽거나 쓰는 경우 HTTP 메시지 컨버터를 사용하면 편리하다. 스프링 MVC는 다음의 경우에 HTTP 메시지 컨버터를 적용한다. HTTP 요청 : @RequestBody, HttpEntity(RequestEntity), HTTP 응답 : @ResponseBody, HttpEntity(ResponseEntity) HTTP 메시지 컨버터는 인터페이스로 구현되어 있다 인터페이스의 주요 함수를 살펴보자 public interface HttpMessageConverter { boolean canRead(Class clazz, @Nullable MediaType mediaType); boolean canWrite(Class clazz, @Nullab..

스프링MVC 2023.08.23

HTTP 응답 - 정적 리소스, 뷰 템플릿

스프링서버에서 응답 데이터를 만드는 방법은 크게 3가지가 있다. 정적 리소스 웹 브라우저에 정적인 HTML, css, js를 제공할 때 정적 리소스를 사용한다 뷰 템플릿 웹 브라우저에 동적인 HTML을 제공할 때 뷰 템플릿을 사용한다 HTTP 메시지 사용 HTTP API를 제공하는 경우에는 HTML이 아니라 데이터를 전달해야 하므로 HTTP 메시지 바디에 JSON 같은 형식으로 데이터를 실어 보낸다. 정적 리소스 스프링 부트는 클래스패스의 다음 디렉터리에 있는 정적 리소스를 제공한다. /static, /public, /resources, /META_INF/resources src/main/resources는 리소스를 보관하는 곳이다 예를 들어 src/main/resources/static/hello.ht..

스프링MVC 2023.08.23

HTTP 요청 -기본, 헤더, 데이터 조회

애노테이션 기반의 스프링 컨트롤러는 다양한 파라미터를 지원한다 HTTP 헤더 정보를 조회하는 방법을 알아보자 @Slf4j @RestController public class RequestHeaderController { @RequestMapping("/headers") public String headers(HttpServletRequest request, HttpServletResponse response, HttpMethod httpMethod, Locale locale, @RequestHeader MultiValueMap headerMap, @RequestHeader("host") String host, @CookieValue(value = "myCookie", required = false) St..

스프링MVC 2023.08.22

스프링 MVC 기본 기능

PathVariable(경로 변수) 사용 최근 HTTP API는 다음과 같이 리소스 경로에 식벽자를 넣는 스타일을 선호한다 /mapping/userA /users/1 이때 @PathVariable을 사용하면 매칭되는 부분을 편리하게 조회할 수 있다. @GetMapping("/mapping/{userId}") public String mappingPath(@PathVariable("userId") String data) { log.info("mappingpath userId={}", data); return "ok" // RestController 사용 이때 PathVarialbe의 변수명과 파라미터의 이름이 같으면 () 부분을 다음과 같이 생략할 수 있다 @GetMapping("/mapping/{user..

스프링MVC 2023.08.21

로깅 간단하게 알아보기

운영 시스템에서 System.out.println()같은 시스템 콘솔을 사용하지 않고 로깅 라이브러리를 사용해서 로그를 출력한다. 로그라이브러리는 많이 있지만 그것을 인터페이스로 제공하는 것이 SLF4J이다 그중 구현체로 Logback을 많이 사용한다. (스프링부트가 기본으로 제공한다) 로그 선언을 자바 코드로 아래 처럼 하면 된다. private Logger log = LoggerFactory.getLogger(getClass()); 하지만 롬복을 사용하면 @Slf4j 애노테이션을 사용하면 위 코드를 작성하지 않아도 된다. 이제 로그를 사용해 보자. String name = "Spring"; log.trace("trace log={}", name); log.debug("debug log={}", nam..

스프링MVC 2023.08.18