스프링부트 의문해결 위키

김진아·2024년 8월 30일

스프링부트

목록 보기
1/6

※ '점프 투 스프링부트'를 보고 따라하면서 간단하게 내가 알고싶은 것들을 정리했다. 주로 ChatGPT로 검색해서 조사한 내용을 적었고, 스프링부트를 시작하기 전 갖춰야 할 기초 수준의 기본 지식(JAVA, SQL 등)을 알고있다는 전제하에 작성했다.

스프링부트 교재를 다 숙지하면 각 파트별로 분리하여 포스팅할 예정



application.properties 파일


스프링부트 프로젝트(어플리케이션) 이름 설정

  • 삽입문
    : spring.application.name=sbb
  • 일반적으로 프로젝트 모듈을 생성하면 기본적으로 설정이 되어있는 부분이다.

데이터베이스 설정(MariaDB)

  • 삽입문
# 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=
  • 연결하고자 하는 DB의 설정값을 세팅하는 코드다. 데이터베이스 이름, 사용자 이름, 비밀번호 등등 설정할 수 있다.
  • 물론 이것만 생성해서는 DB를 사용할 수 없고 밑에 있는 gradle 설정 코드를 통해 커넥터까지 다운로드해줘야 사용할 수 있다.

JPA - 데이터베이스 설정

# 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쿼리가 정렬되어 나오게 해줘서 실행 결과를 쉽게 볼 수 있게 해준다.



Gradle 파일


자동재시작 도구

  • 삽입문

    : developmentOnly 'org.springframework.boot:spring-boot-devtools'

  • developmentOnly : Spring Boot 프로젝트에서 개발 중에만 사용하는 의존성*을 추가하는 설정(developmentOnly)이다. 이 의존성은 개발 효율성을 높이는 도구들을 포함하고 있다.

  • 애플리케이션 코드나 리소스 파일이 변경되었을 때, Spring Boot DevTools는 애플리케이션을 자동으로 재시작한다. 이로 인해 코드 변경 사항을 즉시 반영하여 개발을 보다 빠르게 진행할 수 있다.

MariaDB연결

  • 삽입문

    : implementation 'org.mariadb.jdbc:mariadb-java-client:3.3.0'

  • implementation : 컴파일 타임과 런타임 모두에서 애플리케이션의 클래스패스에 포함된다. 즉, 이 의존성은 애플리케이션이 실행될 때 필요한 모든 클래스와 기능 제공

  • MariaDB와 연결해주는 커넥터이다.

  • Maven Repository라는 사이트에서 검색하여 얻어낼 수 있다. Maven Repository에 대해서는 따로 알아보자.

Lombok 라이브러리

  • 삽입문

    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
  • 구성요소
    • compileOnly : 컴파일할 때만 필요함을 의미
    • annotationProcessor : 컴파일 타임에만 사용하고 어노테이션을 생성하고 필요한 메소드들을 자동 생성 처리함을 의미
  • getter, setter 메소드를 포함해 다양한 메소드를 자동 생성해주는 편리한 라이브러리이다.
  • 어노테이션만 있으면 메소드를 생성할 수 있다. 그러나 생성된 메소드가 눈에 보이지는 않기 때문에 어떤 기능을 하는지 직접 찾아볼 것.

JUnit 프레임워크

  • 삽입문

    testImplementation 'org.junit.jupiter:junit-jupiter'
    testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
  • 테스트 기반 프레임 워크
  • 독립된 단위테스트*를 지원해주는 프레임워크
  • 스프링 웹 의존성을 부여받으면 testImplementation 'org.springframework.boot:spring-boot-starter-test'이 코드가 자동으로 들어가 있는데, 이 경우 JUnit을 따로 추가할 필요는 없다.

JPA 라이브러리

스트링부트용 Spring Data Jpa 추상화 라이브러리. 스트링부트 버전에 맞춰 자동으로 JPA관련 라이브러리들의 버전을 관리해준다. 이 라이브러리를 추가하면 JPA를 사용하는데 필요한 대부분의 설정과 라이브러리가 자동으로 포함되어, 개발자는 더 적은 코드로 데이터베이스와 상호작용할 수 있다.

  • 삽입문

    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
  • 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'

스프링 Validation 라이브러리

  • 삽입문
    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의 인증 및 권한 부여 기능을 쉽게 사용할 수 있도록 도와준다.




어노테이션


@Container

클래스를 스트링부트의 컨트롤러가 되게 해준다. 조금 더 정확히는 프레임워크가 컨트롤러로서 인식하도록 만드는 것.

@GetMapping

요청된 URL과의 매핑을 담당한다. 브러우저가 URL을 요청하면 스프링부트는 요청페이지와 매핑되는 메소드를 찾아 실행한다.

@ResponseBody

기본적으로 Spring MVC에서는 컨트롤러 메소드가 반환하는 값이 뷰 이름으로 해석되어, JSP나 HTML 페이지를 랜더링한다. 하지만 @ResponseBody를 사용하면 반환 값이 뷰를 거치지않고 바로 HTTP 응답 본문에 포함된다. 이때 반환 값은 JSON, XML, 또는 다른 형식으로 직렬화되어 클라이언트에게 전달된다.

@Setter

클래스의 필드에 대해 자동으로 setter 메소드를 생성해주는 기능을 제공

@Getter

클래스의 필드에 대해 자동으로 getter 메소드를 생성해주는 기능을 제공

@Entity

스프링부트가 클래스를 엔티티로 인식하게 해준다.

@Id

= SQL의 'PRIMARY KEY'
id속성을 기본키로 지정한다.

@GeneratedValue

= SQL의 'AUTO_INCREMENT'
데이터를 저장할 때 해당 속성에 값을 일일이 입력하지 않아도 자동으로 1씩 증가하여 저장된다.
어노테이션 오른쪽에 붙는 옵션 (strategy = GenerationType.IDENTITY)는 고유한 번호를 생성하는 방법을 지정하는 부분으로, GenerationType.IDENTITY는 해당 속성만 별도로 번호가 차례대로 늘어나도록 할 때 사용한다.

stratege 옵션을 생략하면 @GeneratedValue 애너테이션이 지정된 모든 속성에 번호를 차례로 생성하므로 순서가 일정한 고유 번호를 가질 수 없게 된다.

@Column

엔티티의 속성은 테이블의 열 이름과 일치하는데, 열의 세부 설정을 위해 사용한다.

  • 열의 세부 설정 예시
    • length = 200 : 열의 길이를 200으로 제한(= SQL의 데이터 타입 Varchar(200))
    • columnDefinition = "TEXT" : '텍스트'를 열 데이터로 넣을 수 있음을 의미하고, 글자 수를 제한할 수 없는 경우에 사용(= SQL의 데이터 타입 TEXT)

      엔티티의 속성은 @Column 어노테이션을 사용하지 않더라도 테이블의 열로 인식한다. 만약 테이블의 열로 인식하고 싶지 않고 클래스의 속성 기능으로만 사용하고자 할 때 @Transient 어노테이션을 사용

@Transition

데이터베이스 맵핑을 제외시켜준다.
특정 필드가 엔티티의 내부 로직에서만 사용되면서 임시적으로 데이터를 저장할 필드가 필요하고, 데이터베이스와의 연관성이 없을 때 유용하다.

@RollBack(boolean)

@ManyToOne

N:1 관계를 나타낸다. 부모 자식 관계(외래키 관계)를 갖는 구조에서 사용. 자식(외래키를 갖는 엔티티)에게 쓴다.

@OneToMany

1:N 관계를 나타낸다. 부모 자식 관계(외래키 관계)를 갖는 구조에서 사용. 부모(기본키를 제공하는 엔티티)에게 쓴다.

속성 mappedBy = "name"는 참조 엔티티의 속성명을 정의한다. 즉, 자식 엔티티에서 부모 엔티티를 참조한 속성인 namemappedBy에 전달해야 한다. 그리고 속성 cascade = CascadeType.REMOVE는 부모의 레코드를 삭제하면 삭제한 부모키를 갖는 자식 엔티티의 레코드들도 함께 삭제시켜준다.

@NotEmpty

스프링부트 Validation라이브러리의 어노테이션이다. 문자열이나 컬렉션 타입의 필드나 메소드 파라미터의 데이터가 비어있지 않음을 검증하는데 사용된다. 데이터가 null값이거나 비어있으면 검증실패로 간주한다.

비슷한 어노테이션
@NotBlank : 문자열 필드에만 적용, null값이나 비어있으면 검증실패, 공백조차도 허용하지 않는다.
@NotNull : null값만 검증

@Configution

스프링의 환경설정 파일임을 선언하고, 이 어노테이션이 붙은 클래스는 빈(Bean)*을 정의한다. 해당 클래스 내의 메소드에 @Bean어노테이션을 붙이면 그 메소드는 스프링 컨테이너에 의해 호출되어 빈을 생성하고 관리하게 된다. 해당 클래스의 모든 빈은 기본적으로 싱글톤으로 관리된다. 즉, 전체 어플리케이션에서 하나의 인스턴스만 생성되어 사용된다.

@EnableWebSecurity

모든 요청 URL이 스프링 시큐리티의 제어를 받도록 하는 어노테이션. 이 어노테이션을 사용하면 스프링 시큐리티를 활성화하는 역할을 한다.

@Bean

스프링 시큐리티의 세부 설정은 @Bean 어노테이션을 통해 SecurityFilterChain 빈을 생성하여 설정할 수 있다.

@PreAuthorize

스프링 시큐리티에서 제공하는 어노테이션으로, 메소드 호출 전에 권한을 검사하는데 사용된다. 이 어노테이션을 사용하면 메소드가 호출되기 전에 지정된 권한 또는 표현식을 평가하여 접근을 제어할 수 있다. 주로 스프링의 메소드 보안 기능과 함께 사용된다.

  • 표현식
    Spring Expression Language(SpEL)표현식이다. SpEL은 스프링 프레임워크에서 제공하는 강력한 표현식 언어로, 다양한 프로그래밍 기능을 표현할 수 있게 해준다. @PreAuthorize("isAuthenticated()")처럼 소괄호 안에 넣어서 사용한다.
    • isAuthenticated() : 현재 사용자가 인증되었는지를 체크하는 SpEL 메소드이다. 이 표현식은 스프링 시큐리티의 인증 객체를 기반으로 사용자 인증 상태를 확인한다. 즉, 사용자가 로그인 상태인지 확인한다.




단어

  • *트랜잭션: 데이터베이스 상태를 변경시키는 작업의 단위. 사용자의 입장에서는 작업의 논리적 단위, 시스템의 입장에서는 데이터들을 접근 또는 변경하는 프로그램의 단위가 된다.
  • *의존성: 하나의 소프트웨어 구성 요소가 다른 구성 요소의 기능이나 서비스를 필요로 하는 관계를 말한다. 의존성은 소프트웨어의 작동이나 기능을 지원하기 위해 다른 라이브러리나 모듈이 필요할 때 사용된다.
  • *단위테스트: 특정 소스코드의 모듈이 의도한대로 잘 작동하는지 검증하는 테스트이다. 즉, 메소드에 대한 테스트를 하는 작업으로서, Spring에서 단위테스트는 Spring Container에 올라와 있는 Bean을 테스트 하는 것이다.
  • *빈 : 빈(bean)은 스프링에 의해 생성 또는 관리되는 객체를 의미한다. 지금껏 만들어 왔던 컨트롤러, 서비스, 리포지터리 등도 모두 빈에 해당한다. 또한 앞선 예처럼 @Bean 애너테이션을 통해 자바 코드 내에서 별도로 빈을 정의하고 등록할 수도 있다.
profile
https://develop-chick.tistory.com/ 첫번째 블로그

0개의 댓글