일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- QueryDSL
- 스프링 핵심 기능
- 스프링
- transaction
- Servlet
- spring
- 김영한
- java
- http
- SpringBoot
- 그리디
- 백준
- JDBC
- springdatajpa
- 알고리즘
- Greedy
- Thymeleaf
- JPQL
- Proxy
- jpa
- Spring Boot
- db
- Android
- 인프런
- Exception
- 스프링 핵심 원리
- kotlin
- pointcut
- 자바
- AOP
- Today
- Total
목록SpringBoot (47)
개발자되기 프로젝트
1. BasicErrorController제공 기능. BasicErrorController 컨트롤러는 다음 정보를 model에 담아서 뷰에 전달한다. 뷰 템플릿에서 이 값을 활용해서 출력할 수 있다. * timestamp: Fri Feb 05 00:00:00 KST 2021 * status: 400 * error: Bad Request * exception: org.springframework.validation.BindException * trace: 예외 trace * message: Validation failed for object='data'. Error count: 1 * errors: Errors(BindingResult) * path: 클라이언트 요청 경로 (`/hello`) 2. Thym..
Servlet을 사용하여 오류 페이지를 만들려면 아래와 같은 과정이 필요함 WebServerCustomizer 예외 종류에 따라서 ErrorPage 를 추가 예외 처리용 컨트롤러 ErrorPageController 1. SpringBoot 사용 SpringBoot는 이런 과정을 모두 해줌 ErrorPage 를 자동으로 등록한다. 이때 /error 라는 경로로 기본 오류 페이지를 설정한다. new ErrorPage("/error") , 상태코드와 예외를 설정하지 않으면 기본 오류 페이지로 사용된다. 서블릿 밖으로 예외가 발생하거나, response.sendError(...) 가 호출되면 모든 오류는 /error 를 호출하게 된다. BasicErrorController 라는 스프링 컨트롤러를 자동으로 등록한..
1. Thymeleaf 매뉴얼 기본 메뉴얼: https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html 스프링 통합 메뉴얼: https://www.thymeleaf.org/doc/tutorials/3.0/thymeleafspring.html 2. Spring 통합으로 추가되는 기능 스프링의 SpringEL 문법 통합 SpringEL 표현식 ~~.username : 프로퍼티 접근 -> user.getUsername() ~~['username'] -> user.getUsername() ~~.getUsername() -> -> getUsername() 직접 호출. ${@myBean.doSomething()} 처럼 스프링 빈 호출 지원 편리한 폼 관리를 위..
엔티티 대신에 DTO를 편리하게 조회할 때 사용 전체 엔티티가 아니라 딱 회원의 이름만 조회하고 싶은 경우! 1. closed Projection 인터페이스만 생성하면 구현체는 SpringDataJpa가 만듦. public interface UserNameOnly { String getUserName(); } 사용 방법 : 아래와 같이 return type으로 인터페이스를 지정해주면 됨. @Test public void projections(){ Team teamA = new Team("teamA"); em.persist(teamA); Member m1 = new Member("m1", 0, teamA); Member m2 = new Member("m2", 0, teamA); em.persist(m1);..
1. SimpleJpaRepository @Repository @Transactional(readOnly = true) public class SimpleJpaRepository ...{ @Transactional public S save(S entity) { if (entityInformation.isNew(entity)) { em.persist(entity); return entity; } else { return em.merge(entity); } } ... } SpringDataJpa의 구현체 @Repository 스프링 빈으로 등록 JDBC/JPA에서 예외가 터지면 Spring에서 사용할 수 있는 예외로 바꿔줌 하부 기술을 바꿔도 예외 처리 메커니즘이 동일하게 유지됨. @Transaction(r..
1. 도메인 클래스 컨버터 HTTP 파라미터로 넘어온 엔티티의 아이디로 엔티티 객체를 찾아서 바인딩해줌 쉽게말해 @Pathvariable로 id를 받으면 스프링이 id를 가지고 엔티티를 바인딩함. findMember : id를 파라미터로 받아 직접 member를 찾아옴. fimdMember2 : id를 파라미터로 받으면 스프링이 member와 바인딩함. @GetMapping("/members/{id}") public String findMember(@PathVariable("id") Long id){ Member member = memberRepository.findById(id).get(); return member.getUserName(); } @GetMapping("/members2/{id}") p..
1. @EntityGraph? 연관된 엔티티들을 SQL 한번에 조회하는방법 2. 사례 member -> team은 다대일 지연로딩 관계. 따라서 team에 대한 데이터 접근(team.get~) 시 쿼리가 날라감. 따라서 member에 대한 쿼리 외에 team의 데이터 조회하는 쿼리 나감. 즉 N+1 이슈 발생함. 3. member만 조회 @Test public void findMemberLazy(){ //given //member1 -> TeamA //member2 -> TeamB Team teamA = new Team("teamA"); Team teamB = new Team("teamB"); teamRepository.save(teamA); teamRepository.save(teamB); Member..
예를들어 모든 인원의 나이를 하나 씩 올리거나, 연봉을 올리거나 할 때, 엔티티를 하나하나 불러와서 업데이트 하는 것 보다. DB에서 bulk로 변경하는 편이 적합하다. 1. JPA로 bulk 연산 executeUpdate()를 실행하면 업데이트, 삭데된 엔티티의 수를 반환. public int bulkAgePlus(int age){ return em.createQuery("update Member m set m.age = m.age + 1 where m.age >= :age") .setParameter("age", age) .executeUpdate(); //Returns: the number of entities updated or deleted } public int bulkAgePlus(int a..