우리는 JdbcTemplate을 사용하는 과정에서 익명 클래스와 람다식이라는 자바 문법을 사용했습니다. 익명 클래스는 자바의 초창기부터 있던 기능이고, 람다식은 자바 8에서 등장한 기능입니다. 다음 키워드를 사용해 몇 가지 블로그 글을 찾아보세요! 아래 질문을 생각하며 공부해보면 좋습니다! 😊
[키워드]
익명 클래스 / 람다 / 함수형 프로그래밍 / @FunctionalInterface / 스트림 API / 메소드 레퍼런스
[질문]
- 자바의 람다식은 왜 등장했을까?
- 람다식과 익명 클래스는 어떤 관계가 있을까? - 람다식의 문법은 어떻게 될까?
1. 자바의 람다식은 왜 등장했을까?
- 람다식은 메서드를 하나의 식으로 표현한것!
- 메서드의 이름과 반환값이 없어지므로 익명함수라고도 불린다.
- 람다식으로 메서드를 변수처럼 다루는것이 가능해졌다!
2. 람다식과 익명 클래스는 어떤 관계가 있을까? - 람다식의 문법은 어떻게 될까?
- 람다식은 메서드에서 이름과 반환 타입을 제거하고 매개변수 선언부와 몸통 {} 사이에 -> 를 추가한다!
- https://gmini.tistory.com/5
Lambda란 무엇일까?
1.1 람다식이란? 메서드를 하나의 식으로 표현한 것이다. 함수를 간략하면서도, 명확한 식으로 표현할 수 있게 해준다. 함수형 언어의 특징을 가지고 있다. int[] arr = new int[5]; Arrays.setAll(arr,(i)->(int
gmini.tistory.com
함수형 프로그래밍인 함수형 인터페이스와 1:1로 매핑 시켜준다고 생각하자!
- 함수형 인터페이스는 @FunctionalInterface 의 어노테이션을 붙여주면 해당 인터페이스가 함수형 인터페이스가 맞는지 확인해준다!
- 함수형 인터페이스 : 추상메서드가 1개밖에 존재하지 않는 인터페이스이다.
- 해당 함수형 인터페이스를 간추려서 작성한 식이 람다식이라고 이해하였다!
- 우리가 작성했던 API 중 람다식을 사용한 부분이 있는데 확인해보자!
@DeleteMapping("/user")
public void deleteUser(@RequestParam String name) {
String readSql = "Select * from user where name = ?";
boolean isUserNotExist = jdbcTemplate.query(readSql, (rs, rowNum) -> 0, name).isEmpty(); // rowMapper 를 람다로 받음 -> rowMapper 는 ResultSet 을 받아서 원하는 객체로 변환해주는 역할을 한다.
if (isUserNotExist) {
throw new IllegalArgumentException();
}
String sql = "Delete from user where name = ?";
jdbcTemplate.update(sql, name);
}
해당 메서드에서 query (readsql , (rs,rowNum)->0,name) 부분에 람다가 쓰인것을 확인해 볼 수 있다. 해당 query 함수를 타고 들어가 보았다.
//JdbcTemplate class / query method
public <T> List<T> query(String sql, RowMapper<T> rowMapper, @Nullable Object... args) throws DataAccessException {
return (List)result(this.query((String)sql, (Object[])args, (ResultSetExtractor)(new RowMapperResultSetExtractor(rowMapper))));
}
해당 query 함수에서 RowMapper 함수형 인터페이스를 매개변수로 사용하고 있음을 확인할 수 있다.
// RowMapper.Class
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package org.springframework.jdbc.core;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.lang.Nullable;
@FunctionalInterface
public interface RowMapper<T> {
@Nullable
T mapRow(ResultSet rs, int rowNum) throws SQLException;
}
- 해당 RowMapper 인터페이스가 함수형 인터페이스로 작성되어있음을 알 수 있다!!
'Spring' 카테고리의 다른 글
Spring MVC -김영한 백엔드 (1) (0) | 2024.04.22 |
---|---|
인프런 워밍업클럽 4일차 과제 (0) | 2024.02.22 |
인프런 워밍업클럽 2일차 과제 (0) | 2024.02.21 |
인프런 워밍업클럽 1일차 과제 (0) | 2024.02.19 |
인프런 워밍업 클럽 - 스터디 0기 BE (0) | 2024.02.19 |