본문 바로가기
스터디

24.08.14.수 Spring Framework

by SSONG1521 2024. 8. 14.

1. CI란 무엇인가?

Continuous Integration 의 약자로 말 그대로 지속적인 통합을 말한다.

개발이 완료되는 시점에 단위기능들을 통합하는 것이 아닌 개발과 동시에 통합을 진행함으로써 소프트웨어의 품질을 향상시키는 것을 목표로 한다.

 

통합을 짧은 주기로 자주, 즉 지속적으로 하게 되면 이러한 문제 요소들을 조기 식별할 수 있으며, 공용 repository에는 신뢰성 있는 소스코드들만 남길 수 있게 되므로 소프트웨어의 품질과 생산성이 향상할 수 있다.

 

 

 


2. DI란 무엇인가?

Dependency Injection의 약자로 의존성을 주입하는 것을 뜻한다.

**  의존성 : 객체의 협력 -> 객체 간의 의존성이 존재

                   파라미터 parameter나 return값 또는 지역변수 등으로 다른 객체를 참조하는 것을 의미

                   하나의 객체는 다른 객체의 부품이 된다.

설정 파일을 통해 객체간의 의존관계를 설정함으로써 외부 Assembler가 객체간의 의존관계를 정의하게 되며, 객체는 직접 의존하고 있는 객체를 생성하거나 검색할 필요가 없어지므로 코드의 관리가 쉬워진다.

 

 

 

https://engineerinsight.tistory.com/46

 

[Spring] Spring Core(2): 의존성 주입(DI), 개념, 방법, 장단점, 생성자 주입을 사용하자!

💋 의존성 주입(DI)이란? 의존성 주입 = Dependency Injection = DI 먼저 '의존성'이 무엇인지부터 알아보자! ✔ 의존성(Dependency) 기업에서 사용하는 애플리케이션은 하나의 객체로 이루어져 있지 않다.

engineerinsight.tistory.com

 

   ** 의존성 주입 방식 (생성자 주입, setter 주입, 필드 주입)

  1) 생성자 주입 (Constructor Injection)

@Service
public class StationConstructorService {
    private final StationRepository stationRepository;

    @Autowired
    public StationConstructorService(final StationRepository stationRepository) {
        this.stationRepository = stationRepository;
    }

    public String sayHi() {
        return stationRepository.sayHi();
    }
}

생성자를 통해 의존관계를 주입받는 방법으로, 우리가 일반적으로 사용해 오던 자바 코드와 딱히 다를 것 없다. 

  • 정적 팩토리 메서드를 사용해서 생성자를 호출하더라도 그 결과는 동일하다. 
  • 생성자를 호출할 때 딱 1번만 호출되기 때문에 stationRepository 변수를 final로 관리할 수 있다.
  • 생성자 주입 사용 시, 생성자가 1개인 경우 @Autowired를 생략할 수 있다. 

 

 

  2) Setter 주입 (Setter Injection)

@Service
public class StationSetterService {
    private StationRepository stationRepository;

    @Autowired
    public void setStationRepository(final StationRepository stationRepository) {
        this.stationRepository = stationRepository;
    }

    public String sayHi() {
        return stationRepository.sayHi();
    }
}

필드의 값을 변경하는 setter 메서드를 통해서 의존 관계를 주입하는 방법이다. 

  • 변경 가능성이 있는 의존 관계에 사용한다.
  • 생성자 호출 이후에 필드 변수에 변경이 일어나야 하므로, stationRepository 변수에 final 제어자를 붙일 수 없다. 

 

 

 

3) 필드 주입 (Field Injection)

@Service
public class StationFieldService {
    @Autowired
    private StationRepository stationRepository;

    public String sayHi() {
        return stationRepository.sayHi();
    }
}

필드에 그대로 주입하는 방법이다.

  • 코드가 간결하다는 것이 가장 큰 장점이다.
  • 하지만, 클래스 외부에서 접근이 불가능해 테스트하기 어렵다는 단점이 있다.
  • 또한 이 코드는 우리가 기존에 작성하던 자바의 코드와는 매우 이질적이다. 위의 생성자 주입, setter 주입의 방식은 Spring 프레임워크의 DI를 사용하지 않아도 작동하는 반면, 이 코드는 DI 프레임워크가 없으면 사용할 수 없게 된다. 

 

 

 

 

위에서 세 가지 방법에 대해서 설명했지만, 생성자 주입을 권장한다.

이유에 대해서는 아래에 세 가지 방식을 자세히 재 보았다. 

 

  • 생성자 주입 방식 
    • 우선, 대부분의 의존 관계는 애플리케이션 종료까지 변할 일이 없는 경우가 많다.
    • 객체를 생성할 때 한 번 생성자를 호출해 의존 관계를 정의하고, 불변으로 설계할 수 있다
    • 순수 자바 코드에서도 파라미터 중 하나라도 누락된 경우에 곧바로 컴파일 예외가 발생해 잘못된 설계에 대해서는 컴파일 조차 하지 않고 문제점을 발견할 수 있다. 
    • DI 프레임워크에 의존하지 않고, 순수 자바 언어로도 잘 작동하며 자바 언어의 객체 지향이라는 특징을 잘 살릴 수 있다. 
  • setter 주입 방식
    •  setter 메서드를 public으로 설정해 놓으면, 의존 관계를 외부에서 자유롭게 수정할 수 있는데, 안정성에 위협이 된다. 
    •  DI가 없이 순수한 자바 코드를 사용할 때 setter를 모두 호출해 필드에 값을 넣을 것을 강제할 수 없다. 따라서 객체를 생성한 후 setter를 호출하지 않은 채로 다른 메서드를 호출하게 되면, 누락된 필드의 변수는 null로 남아있어 NullPointerException이 발생하게 된다. 
  • 필드 주입 방식
    • DI 프레임워크에 가장 크게 의존해, 순수 자바 언어로는 무용지물이다.
    • 테스트하기조차 어렵기 때문에 비교할 것도 없이 사용하지 않는 편이 좋다. 

 

 

 

더보기

Spring 3가지 핵심 프로그래밍 모델 (AOP, DI, IOC)

 

 

 

 


3. AOP란 무엇인가?

Aspect Oriented Programming  관점 지향 프로그래밍을 뜻하며 다양한 곳에서 자주 사용되는 공통 관심요소를 단일 기능으로 뽑아내어 코드의 중복을 줄이고 관리의 효율성을 높이는 것을 목적으로 한다.

로깅이나 로그인 등의 기능을 예로 들 수 있다.

 

OOP(Object Oriented Programming)와 이름이 비슷하여 상반된 개념 같지만, 관점 지향 프로그래밍은 객체지향 프로그래밍을 보완하기 위해 쓰인다. 기존 객체지향은 목적에 따라 class를 만들고 객체를 만들었다. 따라서 핵심 비지니스 로직이나 부가 기능의 로직이 객체로서만 분리하는 데 그치고 어떤 것이 더 중요한지 어떻게 나눠쓰고 바라볼지에 대한 정의가 부족해서 만들어진 프로그래밍 기술

 

 

AOP 적용방식

  1) 컴파일 시점 적용

      AspectJ 컴파일러가 일반 .java 파일을 컴파일 할 때 부가기능을 넣어 .class 파일로 컴파일해주는 것을 의미

      이 동자작이 AspectJ와 실제 코드를 연결하는 weaving위빙이라고 부른다.

  2) 클래스 로딩 시점 적용

     JVM내 클래스 로더에 .class 파일을 올리는 시점에서 byte 바이트 코드를 조작해 부가기능 로직을 추가하는 방식

  3) 런타임 시점 적용 (SPRING AOP)

      컴파일, 클래스로딩, main() method 실행 이후에 자바가 제공하는 범위 내에 부가기능을 적용하는 방식

      프록시를 통해 부가 기능을 적용하는 방식

      프록시는 메서드 실행 시점에서만 다음 타겟을 호출할 수 있기 때문에

 

 


4. POJO(Plain Old Java Object)란 무엇인가?

Plain Old Java Object, 간단히 POJO는 말 그대로 해석을 하면 오래된 방식의 간단한 자바 오브젝트라는 말로서 J2EE등의 중량 프레임워크들을 사용하게 되면서 해당 프레임워크에 종속된 "무거운" 객체를 만들게 된 것에 반발해서 사용하게 된 용어이다. POJO라는 용어는 이후에 주로 특정 자바 모델이나 기능, 프레임워크 등을 따르지 않은 자바 오브젝트를 지칭하는 말로 사용되었다. 스프링 프레임워크는 POJO 방식의 프레임워크이다.

즉, Java 스펙에 정의된 것 이외에 다른 기술이나 규약에 얽매이지 않는다.

 

 

 


5. Maven(메이븐)에 대하여 말해 보세요

- JAVA용 프로젝트 관리 툴

- 아파치(Apache) 오픈 소스 빌드 툴

- 빌드

- 문서화

- 리포팅

- 의존 관계

- 소스 코드 관리

- 릴리즈

- 배포

- 프로젝트 관리에 필요한 모든 작업을 추상화하고 표준화해서 반복을 제거

- 메이븐Maven이 접근할 수 있는 저장소를 지원

- 이 저장소를 통해 템플릿 프로젝트인 아키타입, 의존 관계에 있는 라이브러리, 메이븐 플러그인 기능을 지원

- 프로젝트 빌드에 필요한 라이브러리, 플러그인을 저장소에서 개발자 PC로 자동으로 다운로드

 

https://velog.io/@leesomyoung/Maven%EA%B3%BC-Gradle%EC%9D%98-%EC%B0%A8%EC%9D%B4-%EB%B0%8F-%EB%B9%84%EA%B5%90

 

Maven과 Gradle의 개념 및 비교

스프링부트 프로젝트를 하며 여러 가지 기능 구현을 하면서 여러 의존성 라이브러리를 추가해야하는 경우가 많았다. 따라서 추가하는 방법을 위해 공식 문서나 스택오버 플로우, 블로그 등을

velog.io

Maven과 Gradle : 빌드 관리 도구  (build 툴 : maven, gradle, ant)

빌드: 소스코드 파일을 컴퓨터에서 실행할 수 있는 독립적인 형태로 변환하는 과정과 결과

빌드를 한다면 소스코드를 컴파일 해서 .class로 변환하고 resource를 .class가 참조할 수 있는 적절한 위치로 옮기고 META-INF와 MANIFEST.MF들을 하나로 압축하는 과정

 

빌드 도구란, 소스코드에서 애플리케이션을 생성하면서 여러가지 외부 라이브러리를 사용하는데, 빌드 관리도구는 사용자가 관리할 필요 없이 필요한 라이브러리들을 자동으로 관리한다.

 

  1. 종속성 다운로드 - 전처리(Preprocessing)
  2. 소스코드를 바이너리 코드로 컴파일(Compile)
  3. 바이너리 코드를 패키징(Packaging)
  4. 테스트 실행(Testing)
  5. 프로덕션 시스템에 배포(distribution)

MAVEN

 

Maven은 Java 전용 프로젝트 관리 도구로, Lifecycle 관리 목적 빌드 도구이며, Apache Ant의 대안으로 만들어졌다.
Maven은 아파치 라이센스로 배포되는 오픈 소스 소프트웨어이다.

** Apache Ant vs Maven

Apache Ant는 비교적 자유도가 높은 편이고, Maven은 정해진 라이프사이클에 의하여 작업을 수행하며, 전반적인 프로젝트 관리 기능까지 포함하는 차이점이 있다. (Maven은 Build Tool + Project Management)

 

POM - Project Object Model

pom은 Project Object Model 의 약자로 이름 그대로 Project Object Model의 정보를 담고있는 파일이다. 이 파일에서 주요하게 다루는 기능들은 다음과 같다.

  • -프로젝트 정보 : 프로젝트의 이름, 개발자 목록, 라이센스 등
  • -빌드 설정 : 소스, 리소스, 라이프 사이클별 실행한 플러그인(goal)등 빌드와 관련된 설정
  • -빌드 환경 : 사용자 환경 별로 달라질 수 있는 프로파일 정보
  • -POM연관 정보 : 의존 프로젝트(모듈), 상위 프로젝트, 포함하고 있는 하위 모듈 등

POM은 pom.xml파일을 말하며 Maven의 기능을 이용하기 위해 POM이 사용된다.

 

 

GRADLE

Maven을 대체할 수 있는 프로젝트 구성 관리 및 범용 빌드 툴이며, Ant Builder와 Groovy script를 기반으로 구축되어 기존 Ant의 역할과 배포 스크립의 기능을 모두 사용가능하며 스프링부트와 안드로이드에서 사용된다

maven은 xml로 라이브러리를 정의하고 활용하도록 되어 있으나, gradle은 별도의 빌드 스크립트를 통하여 사용할 어플리케이션 버전, 라이브러리 등의 항목 설정 할 수 있다.

 

 

groovy

Groovy는 JVM에서 실행되는 스크립트 언어이다. JVM에서 동작하지만 소스코드를 컴파일할 필요 없다. Java와 호환되며, Java class file들을 Groovy class로 사용 가능하다.
Java 문법과 유사하여 빌드 처리를 관리할 수 있다.

 

 

Maven Gradle
   
   

 

 

 

 

+ Gradle 방식

 

 

 

 


6. SVN(Subversion)에 대하여 말해 보세요

- SVN은 버전관리 시스템을 서버기반으로 사용할 수 있는 프로그램이다.

- 중앙집중관리식 형상관리 소스 관리 툴 (Cemtralized version control)

- 로컬과 SVN 서버와 커밋 넘버링 방식으로 SVN버전을 체크하여서 동기화를 하는 방식이다.

- 각각의 개발자들이 본인의 코드 변경 사항을 하나의 중앙 저장소 (Center Repository) 에 commit 하는 방식으로 운영합니다.

 

 

SVN 장점

  • 원자적인 커밋을 지원하므로 다른 사용자의 커밋과 얽히지 않습니다. 롤백도 가능합니다.
  • 파일과 디렉토리의 삭제, 이동 이름 변경, 복사같은 기능들을 지원합니다.
  • 소스 파일 이외에 이진 파일(텍스트 파일이 아닌 컴퓨터 파일) 도 효율적으로 저장 가능합니다.
  • 디렉터리도 버전 관리를 할 수 있습니다.
  • 저장소의 크기에 상관없이 일정한 시간 안에 가지치기나 태그를 할 수 있습니다.
  • 처리 속도가 상대적으로 빠릅니다.

SVN 단점

  • 소스코드는 merge가 가능하지만 이진파일은 어느 한쪽을 버릴 수 밖에 없습니다.
  • 개별 개발자만의 개발 이력을 가질 수 없습니다.
  • 잦은 커밋이 발생하면 리비전 번호가 크게 증가할 수 있습니다.
  • 충돌이 일어날 확률이 높습니다.

 


7. Hibernate에 대하여 말해 보세요

Hibernate은 ORM(Object-Relational Mapping) 프레임워크의 한 종류이다.

많이 사용하는 MyBatis도 같은 부류의 프레임워크이다.

 

하이버네이트는 자바 언어를 위한 ORM 프레임워크에요. JPA의 구현체로, JPA 인터페이스를 구현하며, 내부적으로 JDBC API를 사용해요.

JPA는 관계형 데이터베이스와 객체의 패러다임 불일치 문제를 해결할 수 있다는 점과 영속성 컨텍스트(엔티티를 영구 저정하는 환경) 제공이 큰 특징이에요.

 

JPA

JPA(Java Persistence API)는 자바 진영의 ORM(Object Relational Mapping:객체 관계 매핑)의 기술의 표준을 말한다. 간단히 말하면 객체관계 매핑을 구현한 API라고 이해하면 된다.

 

자바 진영의 다양한 ORM 프레임워크 중 가장 많이 사용되는 프레임워크로써, Hibernate 기반으로 만들어진 ORM 기술 표준이 바로 JPA이다. 다시 말하면, JPA라는 ORM기술 표준을 구현한 것이 Hibernate이므로, JPA를 사용하려면 Hibernate를 사용하면 된다.

 


8. O/R Mapping에 대하여 말해 보세요

ORM 이란 객체와의 관계를 맵핑시킨다는 뜻인데, 객체와 DB 정보의 관계를 맵핑시켜 좀 더 효율적으로 데이터를 처리하고자 하는 프레임워크이다.

 

ORM(Object-Relational Mapping)은 객체 지향 프로그래밍 언어를 사용하여 호환되지 않는 유형의 시스템 간에 데이터를 변환하는 프로그래밍 기술입니다. 즉, 객체와 관계형 데이터베이스의 데이터를 매핑하는 것을 의미합니다.

 

 

 


9. iBATIS역할에 대하여 말해보세요

iBatis(아이바티스)는 SQL에 기반한 데이터베이스와 JAVA, 닷넷(.NET), 루비(Ruby) 등을 연결시켜 주는 역할을 하는 영속성 프레임워크이다. 이러한 연결은 프로그램의 소스코드에서 SQL 문장을 분리하여 별도의 XML 파일로 저장하고 이 둘을 서로 연결시켜주는 방식으로 작동한다.

또 다른 영속성 프레임워크인 하이버네이트(Hibernate)와 비교하여 하이버네이트는 객체모델을 사용자가 생성을 하면 프레임워크에서 데이터베이스와 연결을 시켜주는 방식인데 반해 iBatis는 사용자가 SQL 문장을 만들면 그에 적합한 객체모델을 생성하는 방식으로 작동한다.

 

 

 



10. REST 서비스란 무엇인가?

확장성 생성 언어(XML) 파일로 된 웹 페이지를 읽어 원하는 정보를 수집하는 기능, 웹 페이지를 만드는 사람은 주기적으로 내용을 개정하고 사용자는 그 페이지의 URL만 알면 웹 브라우저로 읽어 정보를 얻을 수 있다. 하이퍼텍스트 전송 규약(HTTP)과 XML을 포함한 웹 기술 및 프로토콜을 사용하는 구조적 형태로서 단순 객체 접근 프로토콜 (SOAP)보다 사용이 간편하고, 사이트 내용을 기술하는 RSS(RDF Site Summary)의 정보 편집 기능과 유사하다. RSS는 자원 기술 개념(RDF)을 사용한다.

 

 

 


11. iBatis와 MyBatis ORM 프레임워크에서 하나 이상의 레코드를 검석해서 컬렉션 리스트로 반환하는 쿼리문 실행 메소드에 대해 말해보세요

- iBatis : queryForList()

- MyBatis : selectList()

 

 

 

 



12. iBatis의 insert() 메소드와 MyBatis insert() 메소드의 차이점에 대해 말해 보세요

- iBatis의 insert() 메소드는 반환값이 Object 형태 입니다.

- MyBatis insert() 메소드는 실행된 레코드 행의 수를 int 정수형으로 반환한다.

 

 

 



13. iBatis의 insert() 메소드를 사용하면 반환값이 Object형이므로 저장 성공과 실패를 if문으로 판별하기가 어렵다. 그러면 iBatis에서 레코드를 저장해서 반환값을 쿼리문으로 실행된 레코드의 갯수로 반환해서 if문으로 분기 하려면 어떻게 해야 하는지 말해 보세요

- update() 메소드를 사용하면 된다.

 

 

 

 

 


14. MyBatis를 이용할 때 쿼리의 종류에는 어떤 것이 있는지 말해 보세요

- 한 건 조회 : selectOne

- 여러 건 조회: selectList

- delete, update 등등

'스터디' 카테고리의 다른 글

241022 취업특강  (0) 2024.10.22
24.08.28.수 PL/SQL  (0) 2024.08.28