포스트

2021-11-22-TIL

2021-11-22-TIL

Today I Learned

Layered Architecture

계층형 아키텍처는 애플리케이션을 표현(컨트롤러), 비즈니스(서비스), 영속성(리포지토리) 같은 계층으로 나누고, 위 계층이 바로 아래 계층에만 의존하게 하는 구조다. 각 계층의 책임이 분명해서 이해하고 테스트하기 쉽다. 링크된 글은 계층형 구조가 흔히 비판받지만 여전히 좋은 기본값이라는 입장에서, 계층을 건너뛰는 호출이나 도메인 로직이 서비스와 컨트롤러에 흩어지는 문제를 피하는 방법을 다룬다.

  • https://dzone.com/articles/layered-architecture-is-good

Spring Boot Console Application

CommandLineRunner를 구현한 빈은 애플리케이션 컨텍스트가 올라온 뒤 run(String... args)로 명령줄 인자를 받아 실행된다. 여러 개라면 @Order로 순서를 정한다. 콘솔 프로그램을 만들거나, 웹 애플리케이션이라도 시작할 때 초기 데이터를 넣는 작업에 쓴다.

  • https://attacomsian.com/blog/spring-boot-console-application
  • https://zetcode.com/springboot/commandlinerunner/

H2 Database

H2는 Java로 작성된 가벼운 관계형 DB로, 애플리케이션 프로세스 안에서 메모리 모드로 띄울 수 있다. Spring Boot는 클래스패스에 H2가 있으면 별도 설정 없이 내장 DB로 연결하고, spring.h2.console.enabled=true로 웹 콘솔을 켜서 데이터를 확인할 수 있다. 테스트와 프로토타입에 편하지만, 운영 DB(MySQL 등)와 SQL 방언과 동작이 다를 수 있다는 점을 감안해야 한다.

  • https://www.baeldung.com/spring-boot-h2-database

@Configuration

@Configuration 클래스는 @Bean 메서드로 빈을 정의하는 설정 클래스다. Spring 문서에 따르면 @Configuration 클래스는 CGLIB로 서브클래싱되어, 한 @Bean 메서드 안에서 다른 @Bean 메서드를 호출해도 새 객체가 아니라 컨테이너에 등록된 싱글턴이 반환된다. @Component 클래스에 @Bean을 선언하는 “lite” 모드에서는 이런 가로채기가 없어서 일반 메서드 호출처럼 매번 새 객체가 만들어진다.

  • https://howtodoinjava.com/spring-core/spring-configuration-annotation/
  • https://mangkyu.tistory.com/75

JPA with Spring

Spring Boot에서 JPA를 쓰면 spring-boot-starter-data-jpa가 EntityManagerFactory, 트랜잭션 매니저, Hibernate 설정을 자동으로 구성한다. 링크된 Baeldung 글은 이 구성을 직접 하는 방법(데이터 소스, LocalContainerEntityManagerFactoryBean, JpaTransactionManager 빈 등록)과 Boot의 자동 설정을 함께 보여 준다.

  • https://www.baeldung.com/the-persistence-layer-with-spring-and-jpa

JPA Auditing

생성 시각, 수정 시각, 작성자처럼 모든 엔티티에 반복되는 필드를 자동으로 채우는 기능이다. 설정 클래스에 @EnableJpaAuditing을 붙이고, 공통 상위 클래스에 @MappedSuperclass와 @EntityListeners(AuditingEntityListener.class)를 선언한 뒤 필드에 @CreatedDate, @LastModifiedDate를 붙인다. 작성자(@CreatedBy)를 채우려면 현재 사용자를 알려 주는 AuditorAware 빈을 등록한다.

1
2
3
4
5
6
7
8
9
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseTimeEntity {
    @CreatedDate
    private LocalDateTime createdAt;

    @LastModifiedDate
    private LocalDateTime updatedAt;
}
  • https://velog.io/@aidenshin/%EC%97%94%ED%8B%B0%ED%8B%B0-%EC%9E%91%EC%84%B1-JPA-Auddit-%EC%A0%81%EC%9A%A9
  • https://webcoding-start.tistory.com/53
  • https://www.baeldung.com/database-auditing-jpa

JPA Schema generate

엔티티 정의로부터 DDL을 만드는 방법이다. Hibernate의 spring.jpa.hibernate.ddl-auto(create, create-drop, update, validate, none)로 시작할 때 스키마를 직접 만들거나 검증할 수 있고, JPA 표준 속성(javax.persistence.schema-generation.scripts.action 등)을 쓰면 DB에 바로 적용하지 않고 DDL 스크립트 파일로 뽑아낼 수 있다. 운영 환경에서는 update나 create를 쓰지 말고 validate나 none으로 두고, 스키마 변경은 Flyway 같은 마이그레이션 도구로 관리하는 것이 안전하다.

  • https://www.baeldung.com/spring-data-jpa-generate-db-schema

Common Lang 3

Apache Commons Lang 3는 java.lang API를 보완하는 유틸리티 모음이다. StringUtils.isBlank(), StringUtils.defaultIfEmpty()처럼 null에 안전한 문자열 처리, ObjectUtils, ArrayUtils, 난수 문자열 생성 등을 제공한다. 같은 기능을 매번 직접 만들지 않아도 된다.

  • https://www.baeldung.com/java-commons-lang-3
  • https://cobbybb.tistory.com/14

Swagger with Spring REST API

Springfox로 Spring REST API에 Swagger 2 문서를 붙이는 방법이다. Docket 빈으로 문서화할 패키지와 경로를 지정하면, 컨트롤러와 모델을 분석해 OpenAPI 명세를 만들고 Swagger UI 화면에서 API를 직접 호출해 볼 수 있다.

  • https://www.baeldung.com/swagger-2-documentation-for-spring-rest-api

REST Service with Spring

Spring 공식 튜토리얼 “Building REST services with Spring”이다. 단순한 CRUD 컨트롤러에서 시작해 HTTP 상태 코드와 예외 처리를 다듬고, Spring HATEOAS로 응답에 관련 링크를 담아 클라이언트가 URI를 하드코딩하지 않게 만드는 단계까지 진행한다.

  • https://spring.io/guides/tutorials/rest/

Transactional Read-only

readOnly = true는 트랜잭션 매니저와 JDBC 드라이버에 주는 힌트다. 링크된 질문은 읽기 전용 메서드가 쓰기 트랜잭션 안에서 호출될 때의 동작을 다룬다. 기본 전파 속성(REQUIRED)에서는 이미 진행 중인 트랜잭션에 참여하므로 새 트랜잭션이 만들어지지 않고, 안쪽 메서드의 readOnly 설정은 바깥 트랜잭션의 특성을 바꾸지 못한다. 읽기 전용 최적화(Hibernate의 플러시 생략 등)는 트랜잭션이 시작되는 바깥 메서드의 설정을 따른다.

  • https://stackoverflow.com/questions/1614139/spring-transactional-read-only-propagation

Testing in Spring Boot

Spring Boot 테스트의 범위를 정리한 자료다. @SpringBootTest는 전체 컨텍스트를 띄우는 통합 테스트이고, @WebMvcTest, @DataJpaTest 같은 슬라이스 테스트는 특정 계층의 빈만 띄워 빠르다. 링크 중 하나는 JUnit 5 테스트 클래스에서 생성자로 빈을 주입받는 방법(@Autowired 생성자 또는 @TestConstructor)을 다룬다.

  • https://www.baeldung.com/spring-boot-testing
  • https://spring.io/guides/gs/testing-web/
  • https://perfectacle.github.io/2020/12/25/dependency-injection-in-junit/
  • https://memostack.tistory.com/195

@DataJpaTest

@DataJpaTest는 JPA 관련 구성(엔티티, 리포지토리, TestEntityManager)만 띄우는 슬라이스 테스트다. Spring Boot 문서에 따르면 기본적으로 각 테스트는 트랜잭션 안에서 실행되고 끝나면 롤백되며, 설정된 데이터 소스 대신 내장 인메모리 DB를 쓴다. 실제 MySQL로 테스트하려면 @AutoConfigureTestDatabase(replace = Replace.NONE)을 붙인다.

  • https://howtodoinjava.com/spring-boot2/testing/datajpatest-annotation/
  • https://www.bezkoder.com/spring-boot-unit-test-jpa-repo-datajpatest/
참고한 자료외부 출처 5

외부 출처

이 글은 저작권자의 CC BY 4.0 라이선스를 따릅니다.

댓글

아직 댓글이 없습니다