크리스피코드
'Java/Spring Boot' 카테고리의 글 목록

Java/Spring Boot

Java/Spring Boot

[Spring Boot] Spring Mail 설정하기

0. 구글 계정 설정 Spring Mail로 이메일을 발송하기 위해서는 구글 계정에서 2단계 인증과 앱 비밀번호를 설정 해야한다. Google 계정 관리 > 보안 > Google에 로그인하는 방법 > 2단계 인증 2단계 인증을 활성화한 뒤, 클릭해서 맨 아래를 보면 '앱 비밀번호'라는 항목이 있다. 이곳에서 새로운 앱 비밀번호를 설정한다. '앱 선택 > 기타'를 선택하고 사용하고자 하는 이름을 설정한다. (중요하진 않다.) 생성을 클릭하면 화면에 16자리의 앱 비밀번호가 나타난다. Spring Mail을 설정할 때 username에 이 구글 메일 주소, 그리고 password에 지금 발급받은 앱 비밀번호를 사용한다. 1. properties 설정 properties 파일과 설정 클래스를 생성한다. 앞서 ..

Java/Spring Boot

[Spring Boot] JSP 사용하기

스프링 부트는 JSP에 대한 설정이 되어있지 않다. JSP를 사용한 MVC 패턴의 애플리케이션을 개발하기 위해서는 직접 의존성을 주입하고 설정해야한다. 0. 외존성 주입 pom.xml에 필요한 라이브러리를 주입한다. javax.servlet jstl org.apache.tomcat.embed tomcat-embed-jasper 상단의 javax.servlet.jstl은 jstl 태그를 사용하기 위한 라이브러이고, 하단의 org.apache.tomcat.embed.tomcat-embed-jasper는 jsp를 사용하기 위한 라이브러리이다. 1. ViewResolver 설정 InternalResourceViewResolver 클래스로 jsp 파일의 prefix, suffix 경로를 설정할 수 있다. @Con..

Java/Spring Boot

[Spring Boot] JpaRepository의 쿼리 메서드 자동 구현

비교적 단순한 쿼리들은 JpaRepository에서 @Query를 사용하지 않아도 구현할 수 있다. 예를들어 두 개의 값을 조건으로 결과를 조회하는 쿼리이다. SELECT * FROM comment WHERE comment_sn = [값 1] AND board_sn = [값 2]; 이를 JpaRepository에서 메서드의 이름을 규칙에 맞게 설정하는 것으로 작성할 수 있다. JpaRepository에는 findById()라는 메서드가 있다. 이 메서드는 Id 하나를 사용해 쿼리를 조회하는 기능을 한다. 이 메서드의 이름을 약간 바꾸면 @Query를 사용하지 않고도 조건 2개를 사용하는 쿼리를 만들 수 있다. Optional findByBoardSnAndCommentSn(Long boardSn, Long..

Java/Spring Boot

[Spring Boot] JpaRepository에서 @Query 사용하기

JpaRepository에서는 기본적인 쿼리들을 미리 만들어 제공하지만 만약 복잡한 쿼리가 필요하다면 @Query를 사용해 쿼리를 직접 작성할 수 있다. @Query("SELECT COALESCE(MAX(commentSn), 0) " + "FROM Comment " + "WHERE boardSn = :boardSn") Long findMaxCommentSnByBoardSn(Long boardSn); @Query 어노테이션에 문자열로 쿼리를 작성하면 된다. 동적으로 작성하고 싶은 내용은 콜론(:)을 사용해 메서드의 파라미터명을 작성하면 된다. 쿼리를 조회하여 반환되는 값은 메서드의 반환 타입으로 작성하면 된다. 주의해야할 점은, @Query에 작성하는 쿼리문의 테이블명과 컬럼명은 실제 데이터베이스에서의 테..

Java/Spring Boot

[Spring Boot] JPA의 Entity에서 1대N 관계 설정

JPA의 Entity에서 1대N 관계를 설정하기 위해서는 @ManyToOne과 @OneToMany를 사용한다. 예를들어, 게시판에는 여러 개의 댓글을 달 수 있으므로 둘은 1대N 관계이다. * cascade = CascadeType.All, orphanRemoval = true 이 둘을 모두 설정하면 부모 엔티티로 자식 엔티티의 생명주기를 관리할 수 있다. public class Board { ... @OneToMany(mappedBy = "board", cascade = CascadeType.ALL, orphanRemoval = true) private List comments; } public class Comment { ... @ManyToOne @JoinColumn(name = "board_sn"..

Java/Spring Boot

[Spring Boot] JPA의 복합키

JPA라는 카테고리를 따로 만들어 정리해야할 것 같지만 일단 스프링 부트와 함께 진행하기 때문에 스프링 부트 카테고리에 정리하기로 했다. 1. @Embeddable 우선 복합키 역할을 할 클래스를 생성한다. @Data @Embeddable public class CommentKey implements Serializable{ @Column(name = "board_sn") private Long boardSn; @Column(name = "comment_sn") private Long commentSn; } 그리고 엔티티에 복합키 역할을 하는 클래스를 변수로 선언해 @EmbeddedId를 사용해 연결한다. @Data @Entity @Table(name = "comment") public class Com..

Java/Spring Boot

[Spring Boot] Controller 예외처리

요청을 받았을 때 각 상황에 따라 예외를 발생시키고 처리하고자 한다. 요청에 대해 처리할 때 다양한 문제가 발생할 수 있는데 이를 예외를 발생시켜 catch에서 처리하는 것이 낫다고 생각했다. 그래서 Service 클래스에 throws 키워드를 사용해 Controller에서 예외에 맞게 응답을 반환할 수 있도록 했다. 여기서 예외는 각 Http 상태 코드에 맞추어 발생시킬 수 있도록 ResponseStatusException을 사용했다. 이 예외 클래스에 getStatus() 메서드가 있는데 이 메서드를 사용해 예외에 해당하는 Http 상태 코드를 HttpStatus 타입으로 반환할 수 있다. catch 문에서는 이 상태 코드를 비교해 알맞은 클라이언트에게 응답을 전달한다. @PutMapping("/{b..

Java/Spring Boot

[Spring Boot] 외부 properties 파일 불러오기

Spring Boot에서 MariaDB를 사용하기 위해서는 드라이버, URL, 사용자 아이디, 비밀번호가 필요하다. 하지만 URL, 아이디, 비밀번호는 민감한 정보이므로 해당 정보를 작성한 properties 파일을 프로젝트 폴더 밖에 저장하려고 한다. 이 경우 @PropertySource 어노테이션을 사용해 해당 파일 경로를 작성해야 한다. package com.chordncode.springboard.config; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotat..