나를 기록하다
article thumbnail
반응형

오늘은 알고리즘 공부를 하면서 자주 마주쳤지만, 제대로 공부해보지 않았던 람다식, 그리고 프로젝트에 필요한 Java MVC, Spring에 대한

공부를 진행하였다.

 

람다식

람다식이란 함수를 하나의 식으로 표현한 것으로, 익명함수의 한 종류이다.

익명함수는 모두 일급 객체이고 일급 객체인 함수는 변수처럼 사용 가능하며 매개변수로 전달이 가능한 특징이 있다.

예시

  • 기존 방식
new Thread(new Runnable() {
   @Override
   public void run() { 
      System.out.println("Welcome Heejin blog"); 
   }
}).start();
  • 람다 방식
new Thread(()->{
      System.out.println("Welcome Heejin blog");
}).start();

특징

  1. 람다식 내 사용되는 지역변수는 final이 붙지 않아도 상수로 간주
  2. 람다식으로 선언된 변수명은 다른 변수명과 중복 불가

장점

  1. 코드의 간결성
  2. 지연연산 수행
  3. 높은 생산성
  4. 병렬처리 가능

 단점

  1. 호출이 까다로움
  2. 재사용 불가
  3. 디버깅 어려움
  4. 가독성 저하
  5. 재귀 부적합

람다 표현식

  1. 매개변수 화살표(->) 함수 몸체로 이용하여 사용 가능
  2. 함수몸체가 단일 실행문이면 { } 생략 가능
//정상적인 유형
() -> {}
() -> 1
() -> { return 1; }

(int x) -> x+1
(x) -> x+1
x -> x+1
(int x) -> { return x+1; }
x -> { return x+1; }

(int x, int y) -> x+y
(x, y) -> x+y
(x, y) -> { return x+y; }

(String lam) -> lam.length()
lam -> lam.length()
(Thread lamT) -> { lamT.start(); }
lamT -> { lamT.start(); }


//잘못된 유형 선언된 type과 선언되지 않은 type을 같이 사용 할 수 없다.
(x, int y) -> x+y
(x, final y) -> x+y

함수형 인터페이스(@FunctionalInterface)

  • 순수 함수와 일반 함수를 구분하기 위해 등장.
  • 함수를 1급 객체처럼 다룰 수 있게 해주는 어노테이션.
  • 구현해야할 메서드가 하나만 정의된 인터페이스를 뜻함.
//구현해야 할 메소드가 한개이므로 Functional Interface이다.
@FunctionalInterface
public interface Math {
    public int Calc(int first, int second);
}

//구현해야 할 메소드가 두개이므로 Functional Interface가 아니다. (오류 사항)
@FunctionalInterface
public interface Math {
    public int Calc(int first, int second);
    public int Calc2(int first, int second);
}

예시

두 값 중 큰 값을 구하는 익명 함수

  • 기존 방식
public class Lambda {

    public static void main(String[] args) {
    
        // 기존의 익명함수
        System.out.println(new MyLambdaFunction() {
            public int max(int a, int b) {
                return a > b ? a : b;
            }
        }.max(3, 5));

    }

}
  • 함수형 인터페이스
@FunctionalInterface
interface MyLambdaFunction {
    int max(int a, int b);
}

public class Lambda {

    public static void main(String[] args) {

        // 람다식을 이용한 익명함수
        MyLambdaFunction lambdaFunction = (int a, int b) -> a > b ? a : b;
        System.out.println(lambdaFunction.max(3, 5));
    }

}
  •  차이점
    1. 함수를 변수처럼 선언 가능
    2. 코드의 간결성
  • 함수형 인터페이스를 구현하기 위한 과정
    1. 인터페이스 개발
    2. 내부에는 단일의 abstract 함수 선언
    3. 위에 @FunctionalInterface 어노테이션을 붙임
중요한 점
1. 람다식으로 생성된 순수 함수는 함수형 인터페이스로만 선언 가능
2. @FuntionalInterface는 해당 인터페이스가 1개의 함수만을 갖도록 제한 → 여러개의 함수 선언시 컴파일 에러

MVC 패턴

  • Model - View - Controller의 약어.
  • GUI 기반의 애플리케이션 개발에 사용된 디자인 패턴.
  • 지금은 백엔드 반의 웹 어플리케이션 개발의 기본 모델이 됨.
  • 화면과 데이터 처리를 분리 → 코드간 종속성 감소, 구성 요소간의 역할을 명확히 함 → 코드 분리 & 협업 용이

MVC 패턴(출처: dinfree.com)

Model

  • 데이터를 처리하는 영역
  • 실제 구현에는 DB와 연동을 위한 DAO(Data Access Object)와 데이터 구조를 표현하는 DO(Data Object) || Entity로 구성
  • View와 Controller에 독립적인 구조
  • DB 처리를 필요로 하는 여러 애플리케이션에서 공유가 가능
  • 웹 애플리케이션이 아닌 경우에도 사용 가능
효과적인 DB 연동 구현을 위해 JPA를 사용하는 경우 DAO는 생략되거나 구현 범위가 축소될 수 있음

View

  • 화면을 담당하는 부분
  • JSP가 여기에 해당
  • EL, JSTL을 사용해 컨트롤러로부터 전달된 데이터의 출력과 HTML, CSS 등을 통해 화면 디자인 처리
  • Model, Controller와의 종속성이 없도록 구현
MVC패턴으로 역할이 명확하게 분리되면 뷰 구현기술이 꼭 JSP가 될 필요는 없음

Controller

  • MVC 패턴의 핵심
  • 모든 사용자 요청의 중심
  • 사용자 요청
    1. 특정 뷰로 바로 가는 것이 아닌 컨트롤러를 통해야 함
    2. 컨트롤러는 사용자 요청에 따라 Model을 이용해 DB에 연동을 처리하고 View에 전달
  • View 전달을 위해서는 데이터가 들어있는 DO 혹은 List<DO> 형태의 객체를 request에 저장 후 View로 포워딩하는 구조
  • 특정 View를 지정해야 하기 때문에 View와 종속관계 발생
    → 규모가 커질수록 Controller가 복잡해지고 관리가 어렵다는 문제 발생
    → Service단이 존재.
  • Service단이란?
    1. Controller의 비중을 줄여주기 위해 실무에서 많이 사용
    2. 유지보수를 목적으로 생성
  • 구현: JSP, Servlet 모두 가능.
    • 간단한 기능의 구현: JSP가 유리한 부분이 많음.
    • 규모와 향후 Spring Framework로의 확장성: Servlet 기반의 구현이 권장
Controller 구현 시 사용자 요청마다 Controller를 만들 수도 있다.(ex) loginForm.html → LoginController → main.jsp)
특정 모듈 단위(ex. ShopController, MemberController)로 하나의 Controller 안에서 여러 요청 단위(로그인, 회원가입, 정보수정 등)를 구분해서 처리하는 것도 가능
또한 프론트 Controller를 따로 두어 요청에 따른 Controller를 호출할 수 있도록 구성할 수 있음

MVC 장점

  1. 디자이너와 개발자의 분업 가능 → 확장 용이
  2. 단순하고 직관적
  3. 코드 재사용성 증가
  4. 뛰어난 유지보수성

면접관련 용어 정리

Spring

자바의 오픈소스 애플리케이션 프레임워크 중 하나.

스프링의 기본 철학은 특정 기술에 종속되지 않고 객체를 관리할 수 있는 프레임워크를 제공하는 것.

컨테이너로 자바 객체를 관리하면서 의존성 주입과 제어의 역전을 통해 결합도를 낮추게 된다.

DI

Dependency Injection의 약자로 의존성 주입을 의미한다.

객체간의 의존관계를 미리 설정해두면, 스프링 컨테이너가 자동으로 연결해준다.

이렇게 되면 직접 의존하는 객체를 생성하거나 검색해서 가져올 필요가 없어서 결합도가 낮아지는 장점이 있다.

IoC

Inversion of Control로 제어의 역전을 의미한다.

제어권이 사용자에게 있지 않고, 프레임워크에 있어서 필요에 따라서 사용자의 코드를 호출하게 된다.

스프링에서는 인스턴스의 생성부터 소멸까지 개발자가 아닌 컨테이너에서 대신 관리하게 된다.

ORM

Object Relational Mapping의 약자로 관계형 데이터베이스(RDBMS)를 OOP(Object Oriented Programming) 언어로 변환해주는 기술이다. 그래서 비즈니스 코드가 DB 테이블에 바로 접근하게 도와준다.

JPA

Java Persistence API의 약자로 ORM을 위해서 자바에서 제공하는 API이다.

자바 객체와 DB 테이블을 매핑하는데 구현체로는 하이버네이트가 있다.

ORM, JPA, Hibernate 장단점

장점으로는 비즈니스 로직에 집중하고 객체 중심으티 개발을 할 수 있게 된다.

또한 메서드를 호출하는 것만으로 쿼리를 수행해서 생산성이 향샹되고, 유지보수 비용이 줄어든다.

마지막으로 특정 DB에 의존하지 않게 된다.

하지만 직접 SQL을 호출하는 것보다 느리고 복잡한 쿼리같은 것은 메서드로 처리하기 힘들다는 단점 또한 존재한다.


회고

아직 Stream API에 대한 지식이 없어서 람다식에 대한 이해에 어려움이 있었다.

글을 쓴 직후부터 Stream API를 공부할 계획이다.

 

그리고 Java를 공부하고 바로 JPA를 공부했었는데 Java MVC에 대한 이해가 없이 진행했었기에 몰랐던 내용들을 알 수 있었다.

다음에 진행할 프로젝트는 JPA를 사용하지 않고 JSP와 Servlet을 사용하면서 Java MVC에 대한 이해를 먼저한 후, 번거로운 절차를 대신 처리해주는 SpringBoot, JPA, thymeleaf 등의 기술을 이용하여 프로젝트를 해보려 한다.

 

마지막으로 예전에 공기업을 준비할 때도 그랬지만 면접준비는 평소에 해두는 것이 좋다고 생각한다.

CS 공부 겸 면접 준비를 평상시에 병행해보려 한다. 인프런으로 컴퓨터공학 관련 인강들도 꽤나 구매해뒀기에 하나씩 들어가면서 CS 지식과 면접 준비를 해볼 생각이다.

반응형
profile

나를 기록하다

@prao

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...