LG CNS 부트캠프 학습일지 17일차
학습 내용
- Functional Interface
- 스프링과 MVC 패턴
Functional Interface
Stream API를 사용하기 위해서는 Functional Interface에 대해서 알아야 한다.
1
2
3
4
5
6
7
8
9
10
@FunctionalInterface
public interface MyRunnable {
void run();
}
public class MyApp {
public static void main(String[] args) {
MyRunnable runnable = () -> {};
}
}
Functional Interface를 스스로 정의해서 사용하는 경우는 거의 없었다. 하지만 메소드 시그니처를 확인할 때 마다 종종 나오는 것들이 있는데 그것이 무엇을 의미하는지는 알 필요가 있다.
- Runnable
- Consumer
- Supplier
- Function
- Predicate
어떤 함수가 매개변수와 반환값이 있는지 없는지 유무로 가능성을 따지면 총 4개가 있다. 그렇게 아무것도 받지 않고 아무것도 반환하지 않는 Runnable, 매개변수를 받기만 하는 Consumer, 아무것도 받지 않지만 반환값이 있는 Supplier, 매개변수를 받아서 반환하는 Function 이렇게 정리할 수 있다. 사실 이름의 의미를 알면 이해하는데 크게 어렵지 않다. Predicate은 filter() 고차함수에서 자주 사용한다. 매개변수를 받아서 조건에 맞는지 여부를 반환한다.
1
2
3
4
5
private void exampleMethod(List<Pokemon> pokemon) {
List<Pokemon> fire = pokemon.stream()
.filter(Pokemon::isFireType)
.toList();
}
스프링과 MVC 패턴
스프링은 MVC 패턴을 사용한다. Model View Controller로 책임을 나눠서 프로그래밍 하는 것을 말한다. 개인적으로 게임에 적용해본 경험이 있는데, 오히려 코드를 이해하기 어려워지는 문제가 있었던 것으로 기억한다. 아무튼 중요한 것은 스프링은 MVC 패턴을 적용해서 만들어졌고, View는 프론트엔드 등 사용자에게 보여지는 것을 지칭한다. Controller는 말 그대로 어플리케이션 조작과 관련된, HTTP 요청을 받아들이는 부분에 해당한다. 스프링에서는 Presentation Layer라고 부르기도 한다. Model은 비즈니스 로직과 데이터베이스와 상호작용하는 부분을 아우른다고 할 수 있는데, 각각 Business Layer (Service Layer) 와 Persistence Layer로 구분해서 부를 수 있다.
DTO (Data Transfer Object), DAO (Data Access Object), Entity 등 다양한 용어가 등장한다. 경험이 부족해서 이유는 모르겠지만 자료를 추상화해서 받아들이지 않는다. 예를 들어 Student라는 객체를 주고받는 것이 아니라 StudentDTO라는 객체를 만들어서 프론트엔드와 통신하고, DAO를 사용해서 데이터베이스와 통신하고 받아들인 자료를 Entity라고 부른다. 관행으로 굳어졌다면 임의로 이름을 붙이는 것은 피해야할 것이지만, 왜 그런 관행이 생겼는지는 알아봐야겠다.
Generics 보충
1
2
3
4
5
6
7
private void foo(List<? extends Person> persons) {
...
}
private void bar(List<? super Person> persons) {
...
}
extends와 super이라는 키워드가 있다. foo() 함수는 extends 키워드를 사용했고, persons 리스트는 Person 클래스를 상속하는 하위클래스의 객체를 담은 리스트의 주소값을 가리킬 수 있다. 반면 bar() 함수는 super 키워드를 사용했고, Person 클래스가 상속하는 상위클래스의 객체를 담은 리스트의 주소값을 가리킬 수 있다. 당연하지만 대표적으로 Object 객체를 담은 리스트를 매개변수로 받을 수 있다.
Comments powered by Disqus.