※ '점프 투 스프링부트'를 보고 따라하면서 간단하게 내가 알고싶은 것들을 정리했다. 주로 ChatGPT로 검색해서 조사한 내용을 적었고, 스프링부트를 시작하기 전 갖춰야 할 기초 수준의 기본 지식(JAVA, SQL 등)을 알고있다는 전제하에 작성했다.
스프링부트 교재를 다 숙지하면 각 파트별로 분리하여 포스팅할 예정
spring.application.name=sbb# DATABASE
spring.datasource.driverClassName=org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mariadb://127.0.0.1:3306/sbb_dev?useUnicode=true&characterEncoding=utf8&autoReconnect=true&serverTimezone=Asia/Seoul
spring.datasource.username=root
spring.datasource.password=
# JPA
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.show_sql=true
첫째줄 코드는 Hibernate가 어플리케이션의 엔티티 클래스를 기반으로 데이터베이스 스키마를 자동으로 업데이트하게 해준다. 둘째줄 코드는 true로 설정시 SQL쿼리가 포맷팅되어서 가독성이 높아지게 해준다. 이는 디버깅하거나 로그를 확인할 때 SQL쿼리가 정렬되어 나오게 해줘서 실행 결과를 쉽게 볼 수 있게 해준다.
: developmentOnly 'org.springframework.boot:spring-boot-devtools'
developmentOnly : Spring Boot 프로젝트에서 개발 중에만 사용하는 의존성*을 추가하는 설정(developmentOnly)이다. 이 의존성은 개발 효율성을 높이는 도구들을 포함하고 있다.
애플리케이션 코드나 리소스 파일이 변경되었을 때, Spring Boot DevTools는 애플리케이션을 자동으로 재시작한다. 이로 인해 코드 변경 사항을 즉시 반영하여 개발을 보다 빠르게 진행할 수 있다.
: implementation 'org.mariadb.jdbc:mariadb-java-client:3.3.0'
implementation : 컴파일 타임과 런타임 모두에서 애플리케이션의 클래스패스에 포함된다. 즉, 이 의존성은 애플리케이션이 실행될 때 필요한 모든 클래스와 기능 제공
MariaDB와 연결해주는 커넥터이다.
Maven Repository라는 사이트에서 검색하여 얻어낼 수 있다. Maven Repository에 대해서는 따로 알아보자.
compileOnly 'org.projectlombok:lombok'annotationProcessor 'org.projectlombok:lombok'compileOnly : 컴파일할 때만 필요함을 의미annotationProcessor : 컴파일 타임에만 사용하고 어노테이션을 생성하고 필요한 메소드들을 자동 생성 처리함을 의미testImplementation 'org.junit.jupiter:junit-jupiter'testRuntimeOnly 'org.junit.platform:junit-platform-launcher'testImplementation 'org.springframework.boot:spring-boot-starter-test'이 코드가 자동으로 들어가 있는데, 이 경우 JUnit을 따로 추가할 필요는 없다. 스트링부트용 Spring Data Jpa 추상화 라이브러리. 스트링부트 버전에 맞춰 자동으로 JPA관련 라이브러리들의 버전을 관리해준다. 이 라이브러리를 추가하면 JPA를 사용하는데 필요한 대부분의 설정과 라이브러리가 자동으로 포함되어, 개발자는 더 적은 코드로 데이터베이스와 상호작용할 수 있다.
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'Spring Data JPA는 JPA를 기반으로 한 데이터 액세스 계층을 간편하게 구현할 수 있도록 도와준다. 이를 통해 데이터베이스와의 상호작용을 쉽게 관리할 수 있다.
데이터베이스의 테이블과 자바 객체 간의 매핑을 지원한다. 엔티티 클래스에 애너테이션을 통해 매핑 정보를 제공할 수 있다.
Spring Data JPA는 리포지토리 패턴을 사용하여 CRUD작업을 쉽게 수행할 수 있는 인터페이스를 제공한다. 이 인터페이스를 정의하면 기본적인 데이터 액세스 로직을 자동으로 구현해준다.
JPA는 데이터베이스 트랜잭션을 관리하는 기능을 제공한다. Spring Boot와 함께 사용할 때, 이러한 트랜잭션* 관리가 자동으로 설정된다.
Spring Boot Starter는 JPA와 관련된 기본 설정 및 의존성*을 자동으로 포함한다. 예를 들어, Hibernate (JPA의 구현체)와 데이터베이스 드라이버와 같은 필수 의존성이 포함된다.
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect'
implementation 'org.springframework.boot:spring-boot-starter-validation'implementation 'org.springframework.boot:spring-boot-starter-security'implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6'thymeleaf-extras-springsecurity6는 Thymeleaf 템플릿 내에서 Spring Security의 인증 및 권한 부여 기능을 쉽게 사용할 수 있도록 도와준다.클래스를 스트링부트의 컨트롤러가 되게 해준다. 조금 더 정확히는 프레임워크가 컨트롤러로서 인식하도록 만드는 것.
요청된 URL과의 매핑을 담당한다. 브러우저가 URL을 요청하면 스프링부트는 요청페이지와 매핑되는 메소드를 찾아 실행한다.
기본적으로 Spring MVC에서는 컨트롤러 메소드가 반환하는 값이 뷰 이름으로 해석되어, JSP나 HTML 페이지를 랜더링한다. 하지만 @ResponseBody를 사용하면 반환 값이 뷰를 거치지않고 바로 HTTP 응답 본문에 포함된다. 이때 반환 값은 JSON, XML, 또는 다른 형식으로 직렬화되어 클라이언트에게 전달된다.
클래스의 필드에 대해 자동으로 setter 메소드를 생성해주는 기능을 제공
클래스의 필드에 대해 자동으로 getter 메소드를 생성해주는 기능을 제공
스프링부트가 클래스를 엔티티로 인식하게 해준다.
= SQL의 'PRIMARY KEY'
id속성을 기본키로 지정한다.
= SQL의 'AUTO_INCREMENT'
데이터를 저장할 때 해당 속성에 값을 일일이 입력하지 않아도 자동으로 1씩 증가하여 저장된다.
어노테이션 오른쪽에 붙는 옵션 (strategy = GenerationType.IDENTITY)는 고유한 번호를 생성하는 방법을 지정하는 부분으로, GenerationType.IDENTITY는 해당 속성만 별도로 번호가 차례대로 늘어나도록 할 때 사용한다.
stratege 옵션을 생략하면 @GeneratedValue 애너테이션이 지정된 모든 속성에 번호를 차례로 생성하므로 순서가 일정한 고유 번호를 가질 수 없게 된다.
엔티티의 속성은 테이블의 열 이름과 일치하는데, 열의 세부 설정을 위해 사용한다.
length = 200 : 열의 길이를 200으로 제한(= SQL의 데이터 타입 Varchar(200))columnDefinition = "TEXT" : '텍스트'를 열 데이터로 넣을 수 있음을 의미하고, 글자 수를 제한할 수 없는 경우에 사용(= SQL의 데이터 타입 TEXT)엔티티의 속성은 @Column 어노테이션을 사용하지 않더라도 테이블의 열로 인식한다. 만약 테이블의 열로 인식하고 싶지 않고 클래스의 속성 기능으로만 사용하고자 할 때 @Transient 어노테이션을 사용
데이터베이스 맵핑을 제외시켜준다.
특정 필드가 엔티티의 내부 로직에서만 사용되면서 임시적으로 데이터를 저장할 필드가 필요하고, 데이터베이스와의 연관성이 없을 때 유용하다.
N:1 관계를 나타낸다. 부모 자식 관계(외래키 관계)를 갖는 구조에서 사용. 자식(외래키를 갖는 엔티티)에게 쓴다.
1:N 관계를 나타낸다. 부모 자식 관계(외래키 관계)를 갖는 구조에서 사용. 부모(기본키를 제공하는 엔티티)에게 쓴다.
속성 mappedBy = "name"는 참조 엔티티의 속성명을 정의한다. 즉, 자식 엔티티에서 부모 엔티티를 참조한 속성인 name을 mappedBy에 전달해야 한다. 그리고 속성 cascade = CascadeType.REMOVE는 부모의 레코드를 삭제하면 삭제한 부모키를 갖는 자식 엔티티의 레코드들도 함께 삭제시켜준다.
스프링부트 Validation라이브러리의 어노테이션이다. 문자열이나 컬렉션 타입의 필드나 메소드 파라미터의 데이터가 비어있지 않음을 검증하는데 사용된다. 데이터가 null값이거나 비어있으면 검증실패로 간주한다.
비슷한 어노테이션
@NotBlank : 문자열 필드에만 적용, null값이나 비어있으면 검증실패, 공백조차도 허용하지 않는다.
@NotNull : null값만 검증
스프링의 환경설정 파일임을 선언하고, 이 어노테이션이 붙은 클래스는 빈(Bean)*을 정의한다. 해당 클래스 내의 메소드에 @Bean어노테이션을 붙이면 그 메소드는 스프링 컨테이너에 의해 호출되어 빈을 생성하고 관리하게 된다. 해당 클래스의 모든 빈은 기본적으로 싱글톤으로 관리된다. 즉, 전체 어플리케이션에서 하나의 인스턴스만 생성되어 사용된다.
모든 요청 URL이 스프링 시큐리티의 제어를 받도록 하는 어노테이션. 이 어노테이션을 사용하면 스프링 시큐리티를 활성화하는 역할을 한다.
스프링 시큐리티의 세부 설정은 @Bean 어노테이션을 통해 SecurityFilterChain 빈을 생성하여 설정할 수 있다.
스프링 시큐리티에서 제공하는 어노테이션으로, 메소드 호출 전에 권한을 검사하는데 사용된다. 이 어노테이션을 사용하면 메소드가 호출되기 전에 지정된 권한 또는 표현식을 평가하여 접근을 제어할 수 있다. 주로 스프링의 메소드 보안 기능과 함께 사용된다.
@PreAuthorize("isAuthenticated()")처럼 소괄호 안에 넣어서 사용한다.isAuthenticated() : 현재 사용자가 인증되었는지를 체크하는 SpEL 메소드이다. 이 표현식은 스프링 시큐리티의 인증 객체를 기반으로 사용자 인증 상태를 확인한다. 즉, 사용자가 로그인 상태인지 확인한다.