스프링 숙련 주차 팀 과제 Q&A

김형준·2022년 5월 27일
0
post-thumbnail

1. 스프링 프레임워크는 어떤 특장점을 가지고 있나요? (3가지 이상)


1) 스프링 프레임워크 정의

The Spring Framework provides a comprehensive programming and configuration model for modern Java-based enterprise applications - on any kind of deployment platform.
[출처: 스프링 공식 홈페이지]

  • 자바 플랫폼을 위한 오픈소스 애플리케이션 프레임워크
  • 엔터프라이즈급 애플리케이션을 개발하기 위한 모든 기능을 종합적으로 제공하는 경량화된 솔루션
  • 엔터프라이즈급 애플리케이션은 번역하면 기업용 애플리케이션인데, 이는 고객을 대상으로 웹 서비스를 제공하는 기업을 위한 애플리케이션이라는 뜻
  • 즉, 기업용 애플리케이션의 요구사항 해결에 초점을 맞춘 프레임워크
    • 신뢰성
    • 서버의 안정성 유지
    • 데이터 관리

2) 스프링 프레임워크의 핵심 원칙

A key element of Spring is infrastructural support at the application level: Spring focuses on the "plumbing" of enterprise applications so that teams can focus on application-level business logic, without unnecessary ties to specific deployment environments.
[출처: 스프링 공식 홈페이지]

  • 스프링 프레임워크는 비즈니스 로직에 집중하게 해준다.
    • 비즈니스 로직(@Service)는 실제 클라이언트의 요청사항이 처리되는 부분
  • 반복되고, 실수가 많은 부분은 스프링이 대부분 처리해주며, 비즈니스 로직 구현에 집중할 수 있게 해준다. (불필요한 자원 낭비를 최소화 해준다.)

3) 특징 및 장점

  • POJO 기반의 구성 (Plain Old Java Object)

    • 코드를 작성할 때, 개발자가 특정한 라이브러리나 컨테이너의 기술에 종속적이지 않음을 의미한다.
    • 즉, Java의 특징인 객체지향적 설계를 그대로 구현할 수 있다.
    • 따라서 가장 일반적인 형태로 코드를 작성하고 실행할 수 있기에 높은 생산성과 유연한 테스트를 할 수 있다는 장점을 지닌다.
  • DI(Dependency Injection, 의존성 주입)을 통한 객체 관계 구성

    • DI는 객체지향 프로그래밍의 강력한 지원군이다.
    • 이를테면, DI를 통해 강한 결합이 가진 최악의 유지보수성을 피하고,
    • 느슨한 결합을 구현하여 유지보수성 및 재사용성을 향상시킨다는 장점을 지닌다.
    • 의존성 주입은 제어의 역전이 일어나는 것을 전제로 스프링 내부의 객체들 간의 관계를 관리할 때 사용한다.
    • 메소드나 객체(Bean)의 호출 작업은 IOC(제어의 역전)을 통해 해당 객체의 외부에서 이루어진다.
    • @AutoWired으로 의존관계를 쉽게 주입할 수 있다. (DI 구현이 쉬움)
    • 물론 @RequiredArgsConstructor 라는 더욱 쉬운 구현 방법도 있다.
  • AOP(관점지향 프로그래밍) 지원

    • 스프링은 AOP를 통해 반복적인 코드를 줄이고 개발자가 핵심 비즈니스 로직에만 집중할 수 있도록 지원한다.
    • 공통 관심 사항(cross-cutting concern) vs 핵심 관심 사항(core concern)
    • 공통 관심 사항과 핵심 관심 사항을 같은 Class 안에 메소드로 구현하면, 둘의 로직이 섞일 경우 유지보수성이 현격히 저하된다.
    • 스프링은 이러한 경우에 AOP를 통해 공통 관심 사항을 분리하여 관리할 수 있도록 지원해준다.
    • @Aspect, @Around 등 관련 어노테이션은 학습 후에 작성 예정
  • 이 외에도 스프링은 개발자가 기본적인 디자인 패턴을 강제적으로 사용하도록 유도하여 코드 구조의 최소한의 퀄리티를 보장한다는 장점을 지닌다.

출처


2. 스프링에서 DI (의존성 주입) 를 사용하는 이유가 무엇인가요?


유지 보수성과 재사용성을 향상시키며, 불필요한 메모리 낭비를 피하기 위해 사용한다고 생각한다.

  • 물론 이 외에도 DI를 사용하며 얻을 수 있는 장점들이 많을 것이다.

  • 하지만 최근에 DI를 구현하며 체감한 느낀점을 바탕으로 적어봤다.

  • 카카오 로그인을 구현하며, 웹과 웹 간의 소통을 위해 @Service, 즉 자바 영역에서 HttpEntity, ResponseEntity, HttpHeaders 등 인터넷 프로토콜과 관련된 다양한 객체들을 사용했다.

  • 절차 지향적 프로그래밍 기법대로 카카오 서버에 토큰을 요청하고, 받아온 토큰으로 다시 카카오 API를 호출하여 계정 정보를 받아왔다.

  • 이 과정에서 HttpHeaders, RestTemplate, ObjectMapper 등은 필요할 경우 생성하여 사용했는데, 이러한 new 연산들이 카카오 로그인 기능이 실행될 때마다 만들어지는 것은 상당히 비효율적이라고 생각이 들었다.

  • 이 때 떠오른 키워드가 DI 였고, 실제로 @Configuration이 붙은 클래스에 @Bean으로 등록한다면 해당 Service에도 DI가 가능할거라는 생각이 들었다.

	@Bean
    public HttpHeaders httpHeaders() {
        return new HttpHeaders();
    }

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

    @Bean
    public ObjectMapper objectMapper() {
        return new ObjectMapper();
    }
  • Bean으로 등록하고 DI를 해주면, 카카오 로그인 기능이 실행되어도 계속해서 Bean에 등록된 하나의 객체를 재사용하기에, new 연산처리 상황과 비교하면 위 기능이 실행되면 실행될수록 메모리 소비량의 차이가 커질 것이다.

  • DI를 구현한 뒤에는 하나의 객체를 반복해서 사용하는 것이니, 객체에 쌓이는 데이터들은 언제 clear 해줄 것인지는 꼭 구현해줘야 한다. (위의 경우 httpHeaders에 계속해서 정보를 add하기 때문에, 사용하기 전에 clear()를 해줘야 올바른 데이터만을 담게된다.)


3. 스프링 시큐리티를 사용해 회원관리하는 방법을 순서도를 통해 정리해 보세요.



4. 개발자 테스트 코드 작성 시 장/단점과 테스트 종류 별 (단위 테스트, 통합 테스트, E2E 테스트) 로 특징은?


1) 개발자 테스트 코드 작성 시 장/단점

장점

  • 클라이언트 코드 (프론트 영역)가 완성되지 않아도 검증할 수 있다.
  • 개발자가 직접 본인이 작성한 코드를 검증하기 위해 테스트 코드를 작성하기 때문에, 효율적으로 검증할 수 있다.
  • 배포 단계에서 테스트 자동화를 구현하면, 더욱 안정적으로 애플리케이션을 배포할 수 있다.
  • 배포 후 크리티컬한 이슈로 인해 막대한 피해를 미리 방지함으로써 피해를 줄일 수 있다.

단점

  • 개발 시간이 오래 걸린다.
  • 테스트 코드를 유지 보수하는 비용이 발생한다.
  • 엣지 케이스를 찾는 데 비용이 발생한다. 이러한 이유로 이를 전문적으로 수행하는 QA 부서도 있다.

2) 테스트 종류 별 특징

  • 단위 테스트

    • 하나의 모듈이나 클래스에 대해 세밀한 부분까지 테스트 가능
      모듈 간에 상호 작용 검증 못함
  • 통합 테스트

    • 두 개 이상의 모듈이 연결된 상태를 테스트
      모듈 간의 연결에서 발생하는 에러 검증 가능
  • E2E 테스트 (End to End Test)

    • 실제 사용자의 실행 환경과 거의 동일한 환경에서 테스트 진행 (=블랙박스 테스팅)

5. ORM, JPA, Spring Data JPA 를 구분해서 설명해 보세요.


1) ORM

  • Object Relational Mapping의 약자로 객체와 RDBMS를 매핑하는 기술

2) JPA

  • Java Persistence API의 약자로 자바 진영의 표준 ORM 기술

3) Spring Data JPA

  • JPA 를 편리하게 사용하기 위해, 스프링에서 JPA 를 Wrapping한 것
  • 스프링 개발자들이 JPA 를 사용할 때 필수적으로 생성해야 하나, 예상 가능하고 반복적인 코드들 → Spring Data JPA 가 대신 작성해준다.
  • Repostiory 인터페이스만 작성하면, 필요한 구현은 스프링이 대신 알아서 해준다.
  • QueryMethod를 제공하여 쿼리 키워드들을 활용하여 디폴트로 제공되는 쿼리 외에 커스텀 쿼리도 구현할 수 있다.
profile
BackEnd Developer

0개의 댓글