Java

[Java] Lombok 라이브러리λ₯Ό μ‚¬μš©ν•œ JDBC ν”„λ‘œκ·Έλž˜λ°

🌟 Sean 🌟 2025. 2. 5. 16:22

[ Lombok μ΄λž€? ]

@μ–΄λ…Έν…Œμ΄μ…˜ 기반으둜 μ½”λ“œλ₯Ό μžλ™μ™„μ„± ν•΄μ£ΌλŠ” λΌμ΄λΈŒλŸ¬λ¦¬μ΄λ‹€. Lombok을 μ΄μš©ν•˜λ©΄ Model 클래슀의 getter,setter λ“± λ‹€μ–‘ν•œ

λ©”μ„œλ“œλ“€μ„ μž‘μ„±ν•˜μ§€ μ•Šμ•„λ„ μžλ™μ™„μ„± μ‹œμΌœμ£ΌκΈ° λ•Œλ¬Έμ— μ½”λ“œκ°€ κ°„κ²°ν•˜κ³  λ‹¨μˆœν™”λ˜λŠ” μž₯점이 μžˆλ‹€. 

 

[ Lombok μ‚¬μš© 예제 ]

Lombok μ‚¬μš© ❌

β˜‘οΈ Lombok을 μ‚¬μš©ν•˜μ§€ μ•ŠμœΌλ©΄ Getter, Setter λ©”μ„œλ“œλ₯Ό μ•„λž˜μ™€ 같이 μž‘μ„±ν•΄μ•Ό ν•œλ‹€.(μ½”λ“œκ°€ κΈΈμ–΄μ§„λ‹€)

public class TodoDTO {
    private Long tno;
    private String title;
    private LocalDate dueDate;
    private boolean finished;

    public Long getTno() {
        return tno;
    }
 
	...μƒλž΅...

    public boolean isFinished() {
        return finished;
    }

    public void setFinished(boolean finished) {
        this.finished = finished;
    }
}

Lombok μ‚¬μš© β­•

β˜‘οΈ Lombok을 μ‚¬μš©ν•˜λ©΄ @Getter , @Setter μ–΄λ…Έν…Œμ΄μ…˜μ„ μ„ μ–Έν•΄μ£Όλ©΄ μ•„λž˜μ™€ 같이 κ°„κ²°ν•œ μ½”λ“œ μž‘μ„±μ΄ κ°€λŠ₯ν•˜λ‹€.

β˜‘οΈ μ½”λ“œ λ‹€μ΄μ–΄νŠΈ 효과

@Getter
@Setter
public class TodoDTO {
    private Long tno;
    private String title;
    private LocalDate dueDate;
    private boolean finished;
}

[ Lombok의 μž₯점 ]

  • μ–΄λ…Έν…Œμ΄μ…˜ 기반의 μ½”λ“œ μžλ™ 생성을 ν†΅ν•œ 생산성 ν–₯상
  • λ°˜λ³΅λ˜λŠ” μ½”λ“œ λ‹€μ΄μ–΄νŠΈλ₯Ό ν†΅ν•œ 가독성 및 μœ μ§€λ³΄μˆ˜μ„± ν–₯상
  • Getter, Setter 외에 λΉŒλ” νŒ¨ν„΄μ΄λ‚˜ 둜그 생성 λ“± λ‹€μ–‘ν•œ 방면으둜 ν™œμš© κ°€λŠ₯

[ 자주 μ‚¬μš©λ˜λŠ” Lombok μ–΄λ…Έν…Œμ΄μ…˜ ]

 

@NorgsConstructor νŒŒλΌλ―Έν„°κ°€ μ—†λŠ” κΈ°λ³Έ μƒμ„±μž 생성
@AllArgsConstructor λͺ¨λ“  ν•„λ“œ 값을 νŒŒλΌλ―Έν„°λ‘œ λ°›λŠ” μƒμ„±μž 생성
@RequiredArgsConstructor final μ΄λ‚˜ @NonNull ν•„λ“œ κ°’λ§Œ νŒŒλΌλ―Έν„°λ‘œ λ°›λŠ” μƒμ„±μž 생성
@EqualsAndHashCode equals와 hashcodeλ₯Ό μžλ™μœΌλ‘œ μƒμ„±ν•΄μ£ΌλŠ” μ–΄λ…Έν…Œμ΄μ…˜
@Data Getter, Setter, RequiredArgsConstructor, ToString,
EqualsAndHashCodeλ₯Ό ν•œλ²ˆμ— μ„€μ •ν•΄μ£ΌλŠ” μ–΄λ…Έν…Œμ΄μ…˜
@Builder μžλ™μœΌλ‘œ ν•΄λ‹Ή ν΄λž˜μŠ€μ— λΉŒλ” μΆ”κ°€
@Cleanup close()처리 μ½”λ“œλ₯Ό μžλ™μœΌλ‘œ 컴파일 μ‹œμ μ— μ™„μ„±,
try ~ catch 문이 ν•„μš”ν•˜μ§€ μ•ŠλŠ” κ°„κ²°ν•œ μ½”λ“œ 지원
@Getter μžλ™μœΌλ‘œ ν•΄λ‹Ή ν΄λž˜μŠ€μ— getter μΆ”κ°€
@Setter μžλ™μœΌλ‘œ ν•΄λ‹Ή ν΄λž˜μŠ€μ— setter μΆ”κ°€

@Builder μ–΄λ…Έν…Œμ΄μ…˜

@BuilderλŠ” 객체λ₯Ό 생성할 λ•Œ μœ μ—°ν•˜κ²Œ 값을 μ„€μ •ν•  수 μžˆλ„λ‘ 도와쀀닀. 이걸 λΉŒλ” νŒ¨ν„΄μ΄λΌκ³  ν•œλ‹€.

 

κΈ°μ‘΄ 방식(μƒμ„±μž μ‚¬μš©) ❌

β˜‘οΈ μ•„λž˜λŠ” builder μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜μ§€ μ•Šκ³  기쑴의 λ°©μ‹λŒ€λ‘œ μƒμ„±μžλ₯Ό μ‚¬μš©ν•˜λŠ” 방법이닀.

β˜‘οΈ λ§€κ°œλ³€μˆ˜μ˜ μˆœμ„œλ₯Ό κΌ­ μ§€μΌœμ•Όν•˜λŠ” 점과 λͺ¨λ“  값을 ν•œ λ²ˆμ— λ„£μ–΄μ•Ό ν•œλ‹€

TodoVO vo = new TodoVO(tno, title, dueDate, finished);

 

λΉŒλ” νŒ¨ν„΄ μ‚¬μš© β­•

β˜‘οΈ λΉŒλ” νŒ¨ν„΄μ„ μ‚¬μš©ν•˜λ©΄ ν•„μš”ν•œ ν•„λ“œλ§Œ μ„ νƒμ μœΌλ‘œ μ„€μ •ν•  수 있고 가독성이 μ’‹λ‹€.

β˜‘οΈ λ˜ν•œ μƒˆλ‘œμš΄ ν•„λ“œκ°€ μΆ”κ°€λ˜λ”λΌλ„ μ‰½κ²Œ μˆ˜μ •ν•  수 μžˆμ–΄ μœ μ§€λ³΄μˆ˜μ— μš©μ΄ν•˜λ‹€.

TodoVO vo = TodoVO.builder()
        .tno(resultSet.getLong("tno"))
        .title(resultSet.getString("title"))
        .dueDate(resultSet.getDate("dueDate").toLocalDate())
        .finished(resultSet.getBoolean("finished"))
        .build();

 

λΉŒλ” νŒ¨ν„΄μ„ μ‚¬μš©ν•˜λ €λ©΄ @Builder μ–΄λ…Έν…Œμ΄μ…˜ 을 μ‚¬μš©ν•˜κ±°λ‚˜, 직접 λΉŒλ” 클래슀λ₯Ό λ§Œλ“€μ–΄μ„œ μ‚¬μš©ν•œλ‹€.

import lombok.Builder;
import lombok.Data;

@Data
@Builder
public class TodoVO {
    private Long tno;
    private String title;
    private LocalDate dueDate;
    private boolean finished;
}

@Cleanup μ–΄λ…Έν…Œμ΄μ…˜

@cleanup 은 μžλ™μœΌλ‘œ λ¦¬μ†ŒμŠ€λ₯Ό close() ν•΄μ£ΌλŠ” 역할을 ν•œλ‹€.

 

κΈ°μ‘΄ 방식 βŒ

β˜‘οΈ κΈ°μ‘΄ λ°©μ‹μ—μ„œλŠ” finally λΈ”λ‘μ—μ„œ close()λ₯Ό μˆ˜λ™μœΌλ‘œ ν˜ΈμΆœν•΄μ•Ό ν•œλ‹€.

β˜‘οΈ try-catch 문을 μ—¬λŸ¬ 번 μ‚¬μš©ν•΄μ•Ό ν•΄μ„œ μ½”λ“œκ°€ κΈΈμ–΄μ§€κ³  가독성이 λ–¨μ–΄μ§„λ‹€.

    public String getTime(){
        String now = null;

        try(Connection connection = ConnectionUtil.INSTANCE.getConnection();
            PreparedStatement preparedStatement = connection.prepareStatement("select now()");
            ResultSet resultSet = preparedStatement.executeQuery();
        ){

            resultSet.next();

            now = resultSet.getString(1);
        } catch (Exception e){
            e.printStackTrace();
        }
        return now;
    }

 

@cleanup μ‚¬μš© β­•

β˜‘οΈ μžλ™μœΌλ‘œ close()λ₯Ό ν˜ΈμΆœν•˜κ³ , try-finally 없이도 μ½”λ“œ μž‘μ„±μ΄ κ°€λŠ₯ν•˜λ‹€.

β˜‘οΈ 가독성이 μ’‹μ•„μ§€κ³  μ½”λ“œκ°€ κ°„κ²°ν•΄μ§„λ‹€.

	public String getTime2() throws Exception {
        @Cleanup Connection connection = ConnectionUtil.INSTANCE.getConnection();
        @Cleanup PreparedStatement preparedStatement = connection.prepareStatement("select now()");
        @Cleanup ResultSet resultSet = preparedStatement.executeQuery();

        resultSet.next();

        String now = resultSet.getString(1);

        return now;

    }

🌟 정리

βœ… JDBC ν”„λ‘œκ·Έλž˜λ° κ³Όμ •μ—μ„œ λ¦¬μ†ŒμŠ€λ₯Ό μ•ˆμ „ν•˜κ²Œ μ •λ¦¬ν•˜λŠ”λ° 도움을 μ€€λ‹€

βœ… 가독성이 μ’‹μ•„μ§€κ³  μ½”λ“œκ°€ κ°„κ²°ν•΄μ§„λ‹€ 

βœ… ν•„λ“œκ°€ λ§Žκ±°λ‚˜ μ„ νƒμ μœΌλ‘œ 값을 λ„£κ³  싢을 λ•Œ μœ μš©ν•˜λ‹€