백엔드 프레임워크 관련 개념 정리

haruceki·2025년 1월 15일
0

키워드 : Spring Boot, DI, AOP, JPA, Hibernate, bean

  1. Java 프로젝트의 Kotlin 컨버팅

    • 컨버팅의 목적 : 유지보수성 향상, 성능 개선, 확장성 확보, 호환성 이유
    • 컨버팅 유형 : 동일한 언어 내 최신 버전 리팩토링, 다른 JVM 언어로 전환, 비 JVM 언어로 컨버팅, 마이크로서비스화(MSA)
    • 염두에 두어야 할 사항
      • 기술적 고려사항 : 기존 코드 분석, 새로운 기술 스택의 학습 곡선, 호환성과 데이터 마이그레이션, 성능 및 테스트
      • 프로젝트 관리 측면 : 점진적 전환 전략, 팀 커뮤니케이션과 교육, 리소스 및 일정
      • 비용 대비 효과 분석
  2. Legacy Spring과 최근 Spring 또는 Spring Boot의 차이점
    legacy 시스템은 과거에 개발된 시스템으로, 새로운 기술과 개발 방법론을 도입하지 않고 오랜 기간 동안 운영되어온 시스템을 말한다. 스프링 프레임워크는 레거시 시스템으로, DI, AOP 등의 개념을 도입, 테스트 용이성을 높여 안정적 코드 작성을 돕는다.

    스프링 부트의 경우 spring boot starter를 이용하며 스프링 프레임워크를 기반으로한 개발환경 구축 도구이다. 스프링 부트는 레거시 시스템의 설정과 배포를 간편하게 할 수 있도록 도와준다. 즉 자동 설정과 내장 서버의 기능을 제공한다.

    • 주요 차이점
      - 설정 : 스프링은 XML (또는 가끔 java config)을 사용하여 설정을 관리하고 스프링 부트는 java config와 application.yml이나 application.properties 조합을 사용한다. 자동 설정을 제공하여 개발자가 별도의 설정 파일을 작성하지 않아도 된다
      • 내장 서버 : 스프링 부트는 내장서버(tomcat, jetty)를 제공하여 앱을 실행할 수 있다. 스프링에서는 외부 서버에 앱을 배포해야 한다.
      • 의존성 관리 : 스프링 부트는 의존성 관리를 자동으로 처리하여 개발자가 수동으로 의존성을 관리할 필요가 없다. 스프링에서는 maven이나 gradle과 같은 빌드 도구를 통해 의존성을 관리해야 한다.
  3. Spring의 의존성 주입(Dependency Injection)
    DI란 외부에서 객체 간의 관계(의존성)를 결정해 주는 것으로, 객체를 직접 생성하는 것이 아니라 외부에서 생성 후 주입하는 방식이다.

    사용하는 이유는 객체 자체가 코드 상에서 객체 생성에 관여하지 않아도 되기 때문에 객체사이의 의존도(결합도)를 낮추어 유연성을 확보하고 확장성이 뛰어난 코드가 되기 때문이다.

    • 의존성 주입 방식 : 필드 주입(클래스의 필드에 생성된 객체를 주입), 수정자 주입(클래스의 주정자를 통해서 의존성을 주입), 생성자 주입(클래스의 생성자를 통해서 의존성을 주입)
      • 생성자 주입의 경우 인스턴스가 생성시 1회 호출되는 것이 보장되므로, 주로 이 방식이 권장된다.
  4. AOP(Aspect Oriented Programming)
    관점 지향 프로그래밍이란 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점 기준으로 각각 모듈화하여 프로그래밍하는 것이다.

    로깅, 보안, 트랜잭션 관리, 성능 모니터링, 예외 처리 같은 공통적인 관심사를 모듈화하여 코드 중복을 줄이고 유지 보수성을 향상시킬 수 있다.

    @Aspect, @Before등을 이용하여 구현할 수 있다.

  5. Spring Boot에서 JPA와 Hibernate의 차이점

    • JPA(java persistence API)는 표준 인터페이스이다. 즉, 자바 애플리케이션에서 객체를 관계형 데이터베이스에 매핑하기 위한 명세이다. JPA는 직접 구현체를 제공하지 않으며 대신 구현체를 사용하는 코드를 작성하기 위한 API를 정의합니다.
      • 기능 : 엔티티(객체)와 테이블 간 매핑, CRUD 연산을 지원하는 표준 인터페이스 제공, JPQL라는 객체지향 쿼리 언어 지원
    • Hibernate는 JPA 구현체 중 하나로, JPA의 표준 인터페이스를 구현하여 자체적으로 강력한 ORM(object-relational mapping)기능을 제공한다. JPA의 모든 기능을 지원하면서 Hibernate 고유의 기능도 추가적으로 제공한다.
      • 기능 : 캐싱 지원, Native SQL 쿼리 지원, 다양한 db dialect 지원, 배치작업, 이벤트 리스너 등 고급 기능
  6. Spring에서 @Transactional 애너테이션의 역할
    트랜잭션을 관리하기 위한 에너테이션으로, 트랜잭션의 시작, 커밋, 롤백 과정을 코드로 작성하지 않아도 자동으로 처리 가능하다.

    → @Transactional가 선언된 메서드가 호출되면 자동으로 트랜잭션이 시작, 메서드 실행이 정상적으로 끝나면 커밋이 이루어지고, 예외가 발생하면 롤백이 된다.

  7. Spring Security의 기본 개념
    Spring Security는 인증(Authentication)과 권한 부여(Authorization)를 제공하는 강력한 보안 프레임워크이다. Spring Security는 다양한 인증 및 권한 부여 메커니즘, 세션 관리, 암호화, CORS, CSRF 방어 등 종합적인 보안 기능을 제공한다.

  8. Spring Boot의 자동 설정(Auto Configuration) 기능
    스프링부트에서는 @EnableAutoConfiguration 또는 @SpringBootApplication 중 하나만 사용하면 자동 환경설정이 가능하다.

    1. @SpringBootApplication이 붙은 어플리케이션을 실행
    2. @Component 어노테이션이 있는 클래스들을 스캔해서 Bean으로 등록 (Bean 등록 1단계)
    3. @EnableAutoConfiguration에 의해 spring.factories 안에 들어있는 수많은 자동 설정이 조건에 따라 적용 (Bean 등록 2단계)
    4. 많은 Bean들이 자동으로 생성되고 어플리케이션이 구동되게 된다.
  9. Spring에서 Bean의 라이프사이클
    스프링은 IoC 컨테이너를 통해 빈을 관리하며, 빈의 생명주기는 객체가 생성되고 초기화된 후 컨테이너에서 사용되고 마지막으로 소멸되는 과정을 말한다.

    1. 생성 (Instantiation): 컨테이너는 설정 파일(XML 또는 Java Config) 또는 @Component 스캔에 따라 Bean을 생성. 이 단계에서 객체는 메모리에 할당된다.
    2. 의존성 주입 (Dependency Injection): 생성된 Bean에 필요한 의존성을 주입. 이는 생성자, 세터 메서드, 또는 @Autowired와 같은 방식으로 이루어질 수 있다.
    3. 초기화 (Initialization): 의존성 주입이 완료된 후, 초기화 작업을 수행
    4. 사용 (Usage): 애플리케이션 로직에서 Bean을 사용.
    5. 소멸 (Destruction): 컨테이너가 종료될 때, Bean이 소멸된다.
  10. Spring에서 REST 컨트롤러와 일반 컨트롤러의 차이점

    • 일반 컨트롤러 : @Controller 사용. 웹 애플리케이션에서 html 페이지를 반환하거나 폼 데이터를 처리하는데 사용됨
    • rest 컨트롤러 : @RestController = @Controller + @ResponseBody. RESTful 웹 서비스에서 json 또는 xml 같은 데이터 형식을 반환하는데 사용됨. 주로 API 요청을 처리하며 클라이언트에게 데이터를 직접 전달함.
profile
희망도 절망도 없이 매일 코딩을 한다.

0개의 댓글