Web/SpringBootStudy 22

코드로 배우는 스프링부트 웹 프로젝트_파일 업로드 처리(2)

업로드 결과 반환과 화면 처리정상적인 사이즈의 이미지 파일이라면 업로드 처리되지만 아직 브라우저에는 아무런 결과가 반영되지 않는다. 결과 데이터는 JSON으로 전송할 것이므로 어떤구조의 데이터를 전송할 것인지 결정해야한다. 브라우저에서 필요한 정보를 정리하면 다음과 같다.업로드된 파일의 원래 이름파일의 UUID 값업로드된 파일의 저장 경로물론 위의 정보는 UploadController에서 파일을 저장할 때 만들어진 하나의 문자열로도 처리가 가능하지만 브라우저에서 처리가 간단할 수 있도록 클래스와 객체를 구성해서 처리한다. 프로젝트 내에 dto 패키지를 구성하고 UploadResultDTO 클래스를 작성한다.@Data@AllArgsConstructorpublic class UploadResultDTO im..

Web/SpringBootStudy 2024.11.11

코드로 배우는 스프링부트 웹 프로젝트_파일 업로드 처리(1)

스프링 부트로 파일 업로드하는것은 단순한 설정으로 가능하다. 별도의 파일 업로드 라이브러리(commons-fileupload)를 이용하거나 Servlet 3버전부터 추가된 자체적인 파일 업로드 라이브러리를 이용하는 방식으로 구분할 수 있다.이 프로젝트에서는서블릿 기반으로 설정한다. 대부분 웹에서는 이미지 파일등을 업로드 할 때 섬네일을 만들어서 처리한다. 예제에서도 섬네일을 만들어 목록이나 조회화면에서 보이도록 하고 조회 화면에서는 섬네일을 클릭 하면 원본 파일이 보이도록 작성한다. 파일 업로드를 위한 설정//application.propertiesspring.servlet.multipart.enabled=truespring.servlet.multipart.location=C:\\uploadspring...

Web/SpringBootStudy 2024.11.07

코드로 배우는 스프링부트 웹 프로젝트_M:N(다대다)관계의 설계와 구현

JPA를 이용해서 M:N(다대다) 관계를 어떻게 구현해야 하는지 예제를 통해서 살펴본다. 이번 장은 '영화(Movie)' 와 '회원(Member)'이 존재하고 회원이 영화에 대한 평점과 감상을 기록하는 시나리오를 기반으로 구성한다.한편의 영화는 여러 회원의 평가가 행해질 수 있다.한 명의 회원은 여러 영화에 대해서 평점을 줄 수 있다.이전 장의 '게시물과 댓글' 에 비해 약간의 차이가 있다. 댓글이 게시물을 참조하며 종속적인 관계지만, 영화와 회원은 독립적인 개체이며 다대다 관계에 해당된다. 이 관계를 표현하기 위해 중간테이블을 사용한다. 실제 M:N(다대다)를 사용하는 경우는 상당히 많다. 대표적인 예는 다음과 같다.학생과 수업의 관계 : 한명의 학생은 여러 수업에 참여하고, 하나의 수업은 여러 학생이..

Web/SpringBootStudy 2024.09.20

코드로 배우는 스프링부트 웹 프로젝트_RestController와 JSON 처리

@RestController서비스 계층까지 완료되었다면 컨트롤러를 만들어서 조회 화면에서 Ajax로 댓글을 표기해야한다. 댓글 데이터는 JSON으로 만들어서 처리하고 별도의 화면이 필요하지 않고 데이터만을 전송합니다. 이런경우 @RestController를 이용해서 처리한다.@RestController@RequestMapping("/replies")@Log4j2@RequiredArgsConstructorpublic class ReplyController { private final ReplyService replyService; @GetMapping(value = "/board/{bno}", produces = MediaType.APPLICATION_JSON_VALUE) public Re..

Web/SpringBootStudy 2024.09.03

코드로 배우는 스프링부트 웹 프로젝트_N:1 연관관계(4)

JPQL로 검색FK를 이용해서 @ManyToOne과 같은 연관관계를 작성했을 때 어려운 작업은 검색에  필요한 JPQL을 구성하는 것입니다.여러 엔티티 타입을 JPQL로 처리하는 것은 Object[] 타입으로 나오기 때문에 다소 복잡하다.//Querydsl 설정dependencies { implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' annotationProcessor 'com.querydsl:querydsl-apt:5.0.0:jakarta' annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persi..

Web/SpringBootStudy 2024.09.02

코드로 배우는 스프링부트 웹 프로젝트_N:1 연관관계(3)

게시물 목록  처리Object[]을 DTO로 변환하기PageResultDTO의 핵심은 JPQL의 결과로 나오는 Object[]을 DTO 타입으로 변환하는 기능입니다. 이 기능은 java.util.function을 이용해서 작성하는데 현재 예제의 경우 JPQL의 실행 결과로 나오는 Object[]을 BoardDTO로 처리해줘야한다.//변환default BoardDTO entityToDTO(Board board, Member member, Long replyCount) { BoardDTO dto = BoardDTO.builder() .bno(board.getBno()) .title(board.getTitle()) .content(board.ge..

Web/SpringBootStudy 2024.08.28

코드로 배우는 스프링부트 웹 프로젝트_N:1 연관관계(2)

JPQL과 left outer join 목록 화면에서 게시글의 정보와 함께 댓글의 수를 같이 가져오기 위해서는 단순히 하나의 엔티티 타입을 이용할 수 없다.이에 대한 해결책 중에서 가장 많이 쓰이는 방식은 JPQL의 조인을 이용하는 방식이다. 엔티티클래스 내부에 연관관계가 있는경우//BoardRepository@Query("SELECT b, w FROM Board b LEFT JOIN b.writer w WHERE b.bno =:bno")Object getBoardWithWriter(@Param("bno") Long bno);Board에서 조회를 하고 있지만 Member 도 같이 조회해야 하는 상황이다. Board 클래스에는 Member 와 연관관계를 맺고 있으므로 b.writer와 같은 형태로 사용한다..

Web/SpringBootStudy 2024.08.23

코드로 배우는 스프링부트 웹 프로젝트_N:1 연관관계(1)

이번장에서는 '회원'과 '게시글' 그리고 '댓글' 이라는 주제로 JPA에서 연관관계를 가장 쉽게 적용할 수 있는 방법을 알아보도록한다.연관관계를 분석하고 @ManyToOne을 이용한 연관관계 설정하는 법연관관계가 없는 상황에서 'left outer join' 처리방법즉시(Eager)로딩과 지연(Lazy)로딩의 차이와 효율적인 처리 방법연관관계와 관계형 데이터베이스 설계관계형 데이터베이스에서는 일대일(1:1), 일대다(1:N), 다대다(M:N)의 관계를 이용해서 데이터가 서로 간에 어떻게 구성되어있는지를 표현한다. 이 표현에서 가장 중요한 것이 PK(기본키) 와 FK(외래키)를 어떻게 설정해서 사용하는지이다. 데이터베이스상에서의 관계와 이에 대한 해석의 가장 큰 차이는 'PK'에 있다. 관계를 해석할 때는..

Web/SpringBootStudy 2024.08.22

코드로 배우는 스프링부트 웹 프로젝트_ MVC/JPA/Thymeleaf (4)

방명록의 조회 처리//ServiceImpl@Overridepublic GuestbookDTO read(Long gno) { Optional result = guestbookRepository.findById(gno); return result.map(this::entityToDto).orElse(null);}//Controller@GetMapping({"/read", "/modify"})public void read(Long gno, @ModelAttribute("requestDTO") PageRequestDTO requestDTO, Model model) { log.info("data gno" + gno); GuestbookDTO dto = guestbookService.read(..

Web/SpringBootStudy 2024.08.22

코드로 배우는 스프링부트 웹 프로젝트_ MVC/JPA/Thymeleaf (3)

목록처리목록 처리를 위해 다음과 같은 상황을 고려해야한다.화면에서 필요한 목록 데이터에 대한 DTO 생성DTO를 Pageable 타입으로 전환Page를 화면에서 사용하기 쉬운 DTO의 리스트 등으로 변환화면에서 필요한 페이지 번호 처리목록 처리를 위한 DTO페이지 요청 처리 DTO(PageRequestDTO)PageRequestDTO는 목록 페이지를 요청할 때 사용하는 데이터를 재사용하기 쉽게 만드는 클래스다. 목록 화면에서는 페이지 처리를 하는 경우가 많기 때문에 '페이지 번호'나 '페이지 내 목록의 개수', '검색 조건'들이 많이 사용된다화면에서 전달되는 목록 관련된 데이터에 대한 DTO를 PageRequestDTO, 화면에서 필요한 결과는 PageResultDTO 라는 이름으로 클래스를 생성한다./..

Web/SpringBootStudy 2024.08.14