스프링 9

Spring Boot JPA 에서 enum type 사용하기

최근 spring boot + kotlin + jpa를 이용해서 개인(?) 프로젝트를 하고 있는데,JPA에서 enum type을 이용할 때 주의점을 알게 되어 기록해본다. Enum Type Column을 만들자테이블(엔티티) 컬럼 하나를 아래와 같이 enum type으로 선언하고 빌드하게 되면 enum 컬럼의 constaint인 CHECK가 자동으로 생성되는데 생각했던 것과 다른 형식으로 만들어지게 된다.enum class TestEnum { HELLO, THIS, IS, TEST}@Entityclass TestTable ( /* pk */ @Id var no: Int, /* 타입 */ @Column(nullable = false) var enum: Tes..

스프링 2024.08.26

[스프링] @RequiredArgsConstructor 생성자 주입 애노테이션

스프링 DI(Dependency Injection) 방식인 Field 주입, Setter 주입, 생성자(Constructor)주입 중 생성자 주입을 코드 없이 자동으로 설정해주는 애노테이션이다. @RequiredArgsConstructor는 초기화 되지 않은 final 필드나 @NotNull이 붙은 필드에 대해 생성자를 생성해준다. 기존 생성자 주입 public class SampleController { private FrstSampleService frstSampleService; private SecSampleService secSampleService; @Autowired public SampleController(FrstSampleService frstSampleService, SecSample..

스프링 2023.11.15

스프링5 프로그래밍 입문 - DB 연동

JDBC 프로그래밍의 단점 보완 JDBC 사용 시, DB 연동에 필요한 Connection을 구한 다음 쿼리를 실행하기 위한 PreparedStatement 생성 / 쿼리 실행 후 finally 블록에서 ResultSet, PreparedStatement, Connection을 닫는 과정이 구조적으로 반복 이를 위해 스프링은 템플릿 메서드 패턴과 전략 패턴을 엮은 JdbcTemplate 클래스 제공 또한 트랜잭션을 사용하는 메서드에 @Transactional 애노테이션만 붙이면 되어 트랜잭션 관리가 쉬움 DataSource 설정 JDBC API는 DriverManager 외에 DataSource를 이용해서 DB 연결 가능 Connection conn = null; try { // dataSource는 생..

스프링 2023.11.05

스프링5 프로그래밍 입문 - AOP 프로그래밍

AOP (Aspect Oriented Programming) aspectjweaver 의존을 추가해야 함 (스프링이 AOP 구현 시 사용하는 모듈) spring-context 모듈을 추가하면 spring-aop 모듈도 함께 의존 대상에 포함 asepctjweaver 모듈은 AOP를 설정하는데 필요한 애노테이션 제공 프록시 부가적인 기능 구현을 위해 기존 코드를 수정하지 않고, 코드 중복도 피하기 위해서 프록시 객체 사용 핵심 기능의 실행은 다른 객체에 위임하고 부가적인 기능을 제공하는 객체를 프록시라고 부름 프록시의 특징이 핵심 기능은 구현하지 않는다는 것 핵심 기능을 구현하지 않는 대신 여러 객체에 공통으로 적용할 수 있는 기능 구현 실제 핵심 기능을 실행하는 객체는 대상 객체라고 부름 AOP 여러 객..

스프링 2023.10.28

스프링5 프로그래밍 입문 - 빈 라이프사이클과 범위

컨테이너 초기화와 종료 스프링 컨테이너는 초기화와 종료라는 라이프사이클을 갖는다 // 1. 컨테이너 초기화 AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppContext.class); // 2. 컨테이너에서 빈 객체를 구해서 사용 Greeter g = ctx.getBean("greeter", Greeter.class); String msg = g.greet("스프링"); System.out.println(msg); // 3. 컨테이너 종료 ctx.close(); 생성자를 이용해서 컨텍스트 객체를 생성하는데 이 시점에 스프링 컨테이너를 초기화함 스프링 컨테이너는 설정 클래스에서 정보를 읽어와 알맞은 빈 객체..

스프링 2023.10.02

스프링5 프로그래밍 입문 - 컴포넌트 스캔

스프링이 직접 클래스를 검색해서 빈으로 등록해주는 기능으로 클래스에 @Component 애노테이션을 붙여야 함 설정 클래스에 빈으로 등록하지 않아도 원하는 클래스를 빈으로 등록할 수 있으므로 컴포넌트 스캔 기능을 사용하면 설정 코드가 크게 줄어든다 @Component 애노테이션에 값을 주었는지에 따라 빈으로 등록할 때 사용할 이름이 결정됨 값을 주지 않으면 클래스 이름의 첫 글자를 소문자로 바꾼 이름을 빈 이름으로 사용함 @Component 애노테이션을 붙인 클래스를 스캔해서 스프링 빈으로 등록하려면 설정 클래스에 @ComponentScan 애노테이션을 적용해야 함 ... @Configuration @ComponentScan(basePackages={"spring"}) public class AppCtx..

스프링 2023.10.02

스프링5 프로그래밍 입문 - 의존 자동 주입

@Autowired @Autowired 애노테이션을 필드나 세터 메서드에 붙이면 스프링은 타입이 일치하는 빈 객체를 찾아서 주입 자동 주입 대상이 필수가 아닌 경우에는 @Autowired(required=false) 로 지정 빈이 존재하지 않을 때 자동 주입 대상이 되는 필드나 메서드에 null 을 전달하지 않음 (기본생성자에 있는 그대로 사용) 일치하는 빈이 없으면 값 할당 자체를 하지 않음 스프링5 부터는 의존 주입 대상에 Optional을 사용해도 됨 매칭되는 빈이 없으면 값이 없는 Optional을 할당 @Autowired public void setDateFormatter(Optional formatterOpt) { if (formatterOpt.isPresent()) { this.dateTim..

스프링 2023.10.02

스프링5 프로그래밍 입문 - 스프링 DI

의존이란? DI (Dependency Injection), 의존 주입이라고 함 객체 간의 의존을 의미 import java.time.LocalDateTime; public class MemberRegisterService{ private MemberDao memberDao = new MemberDao(); public void regist(RegisterRequest req){ // 이메일로 회원 데이터(Member) 조회 Member member = memberDao.selectByEmail(req.getEmail()); if(member != null){ // 같은 이메일을 가진 회원이 이미 존재하면 익셉션 발생 throw new DuplicateMemberException("dup email" + ..

스프링 2023.10.02

스프링5 프로그래밍 입문 - 스프링 프로젝트 시작하기

메이븐 의존 설정 org.springframework spring-context 5.0.2.RELEASE 메이븐은 한 개의 모듈을 아티팩트라는 단위로 관리 spring-context라는 식별자를 가진 5.0.2 RELEASE 버전의 아티팩트에 대한 의존을 추가 의존 추가는 자바 어플리케이션에서 클래스패스에 spirng-context 모듈을 추가한다는 것 (jar 파일 추가) 메이븐 리포지토리 메이븐 로컬 리포지토리에서 [그룹 ID]\[아티팩트 ID]\[버전] 폴더에 아티팩트ID-버전.jar 형식의 이름을 갖는 파일이 있는지 검사 로컬 리포지토리에 파일이 없으면 메이븐 원격 중앙 리포지토리로부터 해당 파일을 다운로드하여 로컬 리포지토리에 복사한 후 사용 의존 전이(Transitive Dependencies..

스프링 2023.10.02