전체 글 72

루퍼스 백엔드 4기를 끝내며

지난 주에 4기를 수료했다.후기를 쓸까 말까 고민을 하다가 나와 같은 고민을 가진 사람에게 도움이 되었으면 해 글을 써본다. 1. 나는 왜 루퍼스를 수강했는가?나는 비전공자로 시작해서 운이 좋게 대기업 계열사 SI 개발자로 취직하게 되었다.입사 후 한번도 해본 적 없던 Java와 Spring을 맨땅에 헤딩하며 배우다 보니 어찌저찌 올해로 5년차가 되었다. 회사 내에서 대리급이 된 지도 1년이 넘었다.내가 속한 팀에는 신입이 들어오지 않아 나는 여전히 팀 내 막내연차였고, 그래서인지 5년차라는게 체감이 되지 않았다.여전히 내가 주니어로 느껴졌고, 팀원들도 아직 주니어 취급을 한다.하지만 이 회사 밖으로 나갔을 때 내 연차는 더이상 주니어가 아니다. 이직 시장에서 대리급(4~6년차)들이 가장 매력적인 연차..

이것저것 2026.08.02

TDD로 개발하는 것은 진짜 효율적일까?

개발을 하다보면 자주 보는 단어가 하나있다. 그것은 바로 TDD. 자주 본 단어기는 한데, 잘 와닿지는 않는다. 방대한 레거시를 가지고 있고, 고객 요구사항을 빨리 쳐내야하는 SM 중심의 회사일 수록 TDD와는 거리가 먼 삶을 살게 된다. (like me..)그러던 중 좋은 기회로 TDD로 간단한 회원 기능을 구현해볼 일이 생겨, 구현 과정에서 배우고 느낀 점을 남겨보려고 한다. # 그래서 TDD가 뭔데?일단 용어부터 정의를 하고 넘어가보자. TDD란 무엇인가?Test-Driven Development 의 약자로 테스트 주도 개발을 뜻한다. 테스트 주도? 테스트 안 하는 개발자가 어딨어? 라고 생각할 수 있겠지만 선 개발 후 테스트가 아니라 선 테스트 후 개발이다.일단 실패하는 테스트를 만들고 (Red..

이것저것 2026.05.15

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

DB 커넥션 풀 (Connection Pool)

사용 배경 실제 서비스 운영 환경에서는 우리가 개발한 자바 프로그램(웹 애플리케이션)과 데이터베이스는 서로 다른 시스템이다. 따라서 DB를 사용하기 위해 데이터베이스 드라이버와 URL을 이용해 커넥션을 생성한다. 이때, 자바 프로그램에서 DBMS로 커넥션을 생성하는 시간은 컴퓨터 입장에서는 매우 길기 때문에 DB 커넥션 생성은 전체 성능에 영향을 줄 수 있으며, 동시에 접속하는 사용자수가 많으면 사용자마다 DB 커넥션을 생성해서 DBMS에 부하를 준다. DB 커넥션 획득 과정 1. 사용자가 WAS에 요청 2. 애플리케이션 로직이 DB 드라이버를 통해 커넥션 조회 요청 3. DB 드라이버가 DB에 TCP/IP 커넥션 연결 4. DB에 ID/PW와 같은 부가정보 전달(인증정보 전달) 5. 인증완료 시, DB..

데이터베이스 2023.11.04

스프링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