가희의자기개발블로그

환경설정 (1) 본문

프로젝트/What's in My Cart

환경설정 (1)

가희gahui 2020. 9. 21. 22:05
반응형

오늘은 가장 기초적인 프로젝트 생성에 대해서 포스팅할 예정이다.

 

프레임 워크 

Spring Boot + JPA + Gradle + JDK 1.8

IDE

IntelliJ(Ultimate)

DB

개발 초기 - H2

 

1. Spring vs Spring Boot

보통 국비지원 학원의 커리큘럼에서는 Spring Framwork를 이용해서 수업을 진행하고 대부분의 학생들도 이 프레임워크를 이용해서 프로젝트를 수행할 것이다. 그렇다면 Spring은 무엇인가? 그리고 Framework는 무엇인가? 그리고 왜 이것이 탄생하게 되었는지.. 아마 많은 분들이 이것에 대해 생각하지 않고 무작정 웹을 배우게 될것이다. 내가 그랬다.... 

Framework는 '틀', '뼈대'라는 뜻을 가지고 있다. 집을 지을때, 아무것도 없는 땅에서 집을 짓는 것과 이미 골조가 있는 땅에 집을 짓는 것중에 어떤게 더 집을 짓기 쉬울건지 생각하면 된다. 

이 뜻으로 이루어 보아, 바보가 아니면 어떤 천사같은 사람이 웹 개발을 더 쉽게 만들기 위해 스프링 프레임워크라는 플랫폼을 개발해 준 것이다(자세한 역사는 위키피디아에서 찾아보자..나도 모른다.). 우리는 이 틀을 이용해서 집을 짓기만 하면된다. 

 

스프링에서 다루는 가장 중요한 모듈 중 DI(의존성 주입) 과 IOC(제어의 역전)에 대해 많이 들어봤을 것이다. 이들로 인해서 좀 더 결합도가 낮은 어플리케이션을 개발할 수 있는 것이다. 왜 결합도가 낮아야 하는가? 정보처리기사를 준비하는 사람들은 많이 들어봤던 말일 것이다.  바로 유지보수성 때문이다.(자세한건 정처기 책을 펴보시기를 바람) 다시 본론으로 돌아와서 

 

의존성 주입에대해서 알아보자 

@RestController

public class MyController {

    private MyService service = new MyService();



    @RequestMapping("/welcome")

    public String welcome() {

        return service.retrieveWelcomeMessage();

    }

}

이건 DI가 없는 예제이다.

MyController는 MyService클래스에 의존하고 있다. 그래서 인스턴스를 이용하기 위해 아래와 같이 코딩해줘야 한다. 

 MyService service = new MyService();

 

이건 객체간의 결합도가 올라간 것이다. 

@Component

public class MyService {

    public String retrieveWelcomeMessage(){

       return "Welcome to InnovationM";

    }

}

@RestController

public class MyController {

    @Autowired

    private MyService service;



    @RequestMapping("/welcome")

    public String welcome() {

        return service.retrieveWelcomeMessage();

    }

}

위는 두개의 어노테이션으로 MyService의 객체를 쉽게 얻을 수 있다. 이는 결합도를 낮춘 것이고 스프링은 이를 지원해 준다. 

 

사실 내가 학원에서 배운 걸 기반으로 생각했을 때 Spring을 이용할때 기억나는 것이라곤, 엄청난 의존성 주입과 괴랄한 xml들 밖에 기억이 나지 않는다. 또, 복잡한 서버 설치와 jar파일 다운로드.... 그래서 스프링에 대한 평은 어렵고, 복잡하고, 거추장스럽다는 것이다. 

하지만, 스프링부트가 나오면서 더는 스프링으로 하는 웹 개발이 복잡하고 거추장스럽지 않게 되었다.

 

이제 갓 웹 개발을 배운 사람들은 스프링과 스프링부트가 각각 다른 프레임워크로 생각하는 경우가 있는데( = 나..), 스프링 부트는 이러한 스프링의 단점을 극복하기 위해 나온 스프링 서브 프레임워크에 불과하다. 

 

스프링부트가 나옴으로써 Transaction Manager, Hibernate Datasource, Entity Manager, Session Factory와 같은 설정을 하는데에 어려움을 극복할 수 있게 되었다. 왜냐? 스프링 부트는 그 모든걸 자동으로 해주니까~! 약간 치트키 같은 느낌이다.

 

 

 

2. Gradle vs Maven

나는 학원에서 Maven으로 배웠다. 그게 뭔지도 모르고 그냥 하는대로 따라했는데 이게 얼마나 불편한 것인지 프로젝트를 하면서 알게되었다. 그렇다면 Gradle은 무엇이고 Maven은 무엇인가?

 이 둘의 차이를 알기 전에 우선, Build가 무엇인지 부터 알고가자

Build란?

 - 소스코드 파일을 컴퓨터에서 실행할 수 있는 독립 소프트웨어 가공물로 변환하는 과정 또는 그에 대한 결과물 이다.
 - 이를 좀더 쉽게 풀어 말하자면 우리가 작성한 소스코드(java), 프로젝트에서 쓰인 각각의 파일 및 자원 등(.xml, .jpg, .jar, .properties)을 JVM이나 톰캣같은 WAS가 인식할 수 있는 구조로 패키징 하는 과정 및 결과물이라고 할 수 있다.


자바 초기에는 Ant를 많이 썼고 요즘엔 Maven이나 Gradle을 많이 사용한다고 한다. 

 

Maven이란?

Apache의 이름 아래 2004년 출시

Ant를 사용하던 개발자들의 불편함을 해소 + 부가기능 추가

  • 빌드를 쉽게 (Making the build process easy)
  • pom.xml을 이용한 정형화된 빌드 시스템 (Providing a uniform build system)
  • 뛰어난 프로젝트 정보 제공 (Providing quality project information_
    • Change log document created directly from source control
    • Cross referenced sources
    • Mailing lists
    • Dependency list
    • Unit test reports including coverage
  • 개발 가이드 라인 제공 (Providing guidelines for best practices development)
    • Keeping your test source code in a separate, but parallel source tree
    • Using test case naming conventions to locate and execute tests
    • Have test cases setup their environment and don’t rely on customizing the build for test preparation.
  • 새로운 기능을 쉽게 설치할 수 있고 업데이트할 수 있음 (Allowing transparent migration to new features)

Gradle이란 ?


Ant와 Maven의 장점을 모아모아 2012년 출시

Android OS의 빌드 도구로 채택 됨

  • Ant처럼 유연한 범용 빌드 도구 (A very flexible general purpose build tool like Ant.)
  • Maven을 사용할 수 있는 변환 가능 컨벤션 프레임 워크 (Switchable, build-by-convention frameworks a la Maven. But we never lock you in!)
  • 멀티 프로젝트에 사용하기 좋음 (Very powerful support for multi-project builds.)
  • Apache Ivy에 기반한 강력한 의존성 관리 (Very powerful dependency management (based on Apache Ivy))
  • Maven과 Ivy 레파지토리 완전 지원 (Full support for your existing Maven or Ivy repository infrastructure.)
  • 원격 저장소나, pom, ivy 파일 없이 연결되는 의존성 관리 지원
    (Support for transitive dependency management without the need for remote repositories or pom.xml and ivy.xml files.)
  • 그루비 문법 사용 (Groovy build scripts.)
  • 빌드를 설명하는 풍부한 도메인 모델 (A rich domain model for describing your build.)

 

대충 이정도로 끝내고 다음은 진짜 실습(?)을 해보도록 하자

 

 

 

 

반응형

'프로젝트 > What's in My Cart' 카테고리의 다른 글

인텔리제이에서 깃과 깃허브 사용하기  (1) 2020.10.02
환경 설정 (1-2)  (0) 2020.10.02
Comments