ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring boot 시작하기
    Spring/Spring Boot 2020. 3. 20. 18:49
    반응형

    국내에선 자바개발자 = 스프링개발자 라고 할정도로 공식화 되있다. 나도 자바개발자 이며 스프링 개발자 이고 저말에 딱히 부인 하지 않는다. 

     회사를 다니면서 신입들을 만날때도 있고 가끔 강의를 나가면 자바개발자가 되려면 어떻게 해야할지 등 이젠 나도 나이가 있다보니 교육(?) 을 해주거나 약간의 주제넘은 조언을 해줘야 하는 경우가 점점 잦아 지고 있다. 그럴때마다 머리속을 검색해서 순서가 뒤죽박죽인 내용들을 공유 해주다보니 항상 후회가 남곤한다. 좀 정리해서 전달 해줄수 있다면 좋았을거 같은데 하고 말이다... 그래서 이렇게 글을 하나 작성해 두고 줄기차게 우려먹으려 한다. 신입들 그리고 대학생들 혹은 자바개발자가 되고 싶은 비전공자들을 위한 간략하고 알찬(?) 입문 글을 한번 작성해보겠다 !

    첫걸음.

    스프링을 이해하기 위해선 일단 언어를 알아야 한다. java 언어에 대한 기본 이해와 사용 노하우가 기본 바탕이 되있어야 한다. 보통 학원에서는 어떻게 가르쳐서 내보내는지 모르겠지만 내가 쓰고자하는 도구를 이용하는 수단에 대한 기본이 없다면 제대로 도구를 사용하지 못한다. 만일 자바를 모르는 사람이라면 일단 자바를 공부를 하고 기본적인 컴퓨터공학 지식을 공부 하길 바란다. ( 신입이나 타언어 개발자라면 이런부분은 기본 숙지 되있으니 이부분은 생략해도 좋다고 본다. ) 

    자바에서 어떤 부분을 봐야 하냐고 한다면 솔직하기는 책한권을 다 읽고 시작하라고 싶다. 그래도 굳이 우선순위를 개인적으로 뽑자면... 

    쓰레드, 메모리관리, collection ,  상속, 인터페이스 , http 통신 , jdbc 최소 이런 개념들은 알아야 하며, 기본적은 문법들은 너무 너무 기초적으로 알아야 하는거라 생략 했다. 

    쓰레드라는 개념은 자바에서 나온것이라기보단 컴퓨터 공학적인 기초 개념에 가깝다. 이해가 안된다면 간단하게 쓰레드 하나는 하나의 작업을 처리하는 단위라고 생각하면 좋을거 같다. 

    실제 컴퓨터에서 구동하는 운영체제는 저런구조라고 생각하면된다. 동기식 비동기식 이런것들이 당장 이해가 안간다면 일단 동기식부터 이해하는게 좋다고 본다. 프로세서에서는 여러가지의 쓰레드를 생성할수 있고  쓰레드에서는 한가지일만 한다. 그렇다면 여러일을 동시에 하고 싶다면? 쓰레드를 여러개를 만들면 된다! 

    자바를 사용한다면 생각보다는 메모리에서 자유롭다. 다른언어들중에는 특히 오래된 언어들은 메모리관리에 헛점이 잘생기는편이다 특히 C 에선 메모리관리를 직접 개발자가 하기때문에 실수의 종족인 인간은 완벽하게 관리해내지 못한다. 자바는 가비지 콜렉터 을 사용하며, 역할은 단순하다 오래 안쓰는 메모리는 치워버리자! 자바 개발자라면 가비지 콜렉터를 절대로 잊어선 안되고 항상 감사한 마음으로 ! 

     collection 은 굉장히 많이 사용하게 되며 map 또한 줄기차기 지겹도록 개발하면서 용하게 될것이다. 실제로 위에 예시보다 많은 종류들이 더있기 때문에 꼭 공부하면 좋을거 같다. 

    상속과 인터페이스는 자바 언어에 더 가까운 이야기들이기 때문에 생략하지만 꼭 알아야 만한다. 이건 객체지향 언어를 사용는 개발자라면 기초 지식이라고 본다! 

    http 통신은 간단하다 웹브라우저와 웹서버 간의 통신 규약 이라고 생각하면 된다. 더 단순하게 이야기하면 서로 전화 통화를 할건데 이걸 규칙을 정해서 할거고 그 규칙이 http 라는것이라고 생각하면 된다. 예전엔 단순 웹페이지 용이였다면 지금은 서버에서 웹브라우저 뿐만 아니라 여러 종류의 클라이언트들에게 데이터를 전달할때 사용된다.  극단적으로는 http 프로토콜만 잘 알고 있어도 ! 고급 신입 스럽게 보일수 있다 ! 현장에선 보통 http 를 거의 대부분 쓰고 있기 때문이다. 

    jdbc 라는건 자바책에서 꼭! 확인할수 있는 부분이다. 서버 개발을 하게 되면 데이터베이스없이는 전혀 아무것도 할수 없다. 데이터를 어디다 저장하고 어디서 불러올것인가를 생각하면 현재 대안은 데이터베이스가 유일하다. RDBMS, NoSql 같이 분류가 되어 사용되고 있고 , 데이터베이스라고 할수는 그렇지만 redis , kafka 같은 메세지 큐같은것들도 알아 두면 좋다. 

     

    두번째 걸음 

    스프링 시작하기라고 해놓고 전혀 스프링이야기는 하나도 없이 작성한거 같다. 하지만 다시 강조하지만 자바 책 한권정도는 정주행하고 이해하고 시작해야 스프링을 제대로 사용할수 있다. 

    스프링 프레임워크이란 ? 

    자바플랫폼을 위한 오픈소스 어플리케이션 프레임워크라고 할수 있다. 그럼 프레임워크란 무엇인가 ! 개인적으로는 개발을 할때 필요한 오픈소스 혹은 툴들이 모여있는 거대한 도구라고 생각한다. 

    실제로 프레임워크를 쓰면 개발시 굉장히 시간이 절약이 된다. 그리고 부가적인 효과지만 같은 프레임워크를 사용하는 개발자 끼리는 코드 공유시 굉장히 분석이 쉬워진다. 구조가 같고 사용방식이 비슷하기 때문이다. 기업 입장에선 굉장히 메리트가 있다고 생각한다. 

    그럼 프레임워크로써 스프링의 특징은 무엇인가 ? 

    자바객체의 라이프 사이클을 관리 해준다. 그리고 스프링으로 부터 필요한 객체들을 가져올수 있다. 말이 어렵지만 단순하게 이야기하면 객체들의 생성과 소멸에 개발자가 심각하게 고려하지 않아도 되고 내가 필요한 것들을 불러오기 위한 수고로움을 보조해주는것이라고 생각하면된다. 

     POJO

     스프링하면 많이 나오는 단어거 POJO 인데 쉽게 말하면 일반적인 자바 개발시 인터페이스라던가 상속을 사용해서 기능을 구현하는 방식을 자주 사용하게 되는데 이럴 경우 각 클래스간의 의존도가 생기게 된다.  의존도 때문에 코드가 수정되어야 할경우 여러부분에 수정해야하는 부분이 많이지는데 , extends 와 implements 를 생략하고 어노테이션을 사용함으로써 의존도를 낮출수 있게 된다.  pojo 예제를 찾아보면 일반적으로 getter/setter 에 대한 내용이 많이 나온다 . 찾아보고 참고하면 좋을거 같다. 

    DI

    스프링을 이야기하면서 또 많이 나오는 영역은 DI 이다. Dependency Injection 이라고 하며 우리말로는 의존성 주입이라고 해석 할수 있다. 찾아보면 어렵게 많이들 이야기 하는데 아래 예시를 보면 간단하게 알수 있다. 

    [ 설정 예시 ] 
    @Configuration
    public class WebConfig {
      @Bean(name = "beanA")
      public BeanA beanA {
        return new BeanA();
      }
    
      @Bean(name = "beanB")
      public BeanB beanB(BeanA beanA) {
        BeanB beanB = new BeanB();
        beanB.setBeanA(beanA);
        return beanB;
      }
    }
     
     
     
     [사용 예시]
     @RestController
    public class DiController {
    
        @Autowired
        private BeanA beanA;
    
        @Autowired
        private BeanB beanB;
    
    }
    
     
    

     

    대부분 DI 예시를 찾아보면 Spring framework 기준으로 xml 로 bean 을 선언하고 그것을 사용하는것을 많이 예제로 사용한다. 하지만 spring boot 를 많이 사용하는 추세이고 xml 로 이해하기에는 xml 이 너무 복잡하다. 그래서 spring boot 는 기본적으로 @Bean 어노테이션 사용을 기본으로 하고 있다. 위 내용을 간단히 설명하면 설정하는 java confing 클래스에서 저런식으로 Bean 으로 설정을 해주고 의존성을 부여해주면 다른곳에서 @Autuwired 를 하여 간단하게 클래스를 불러서 사용할수 있다. 기본적으로 스프링 부트는 실행이 시작할때 @Bean 으로 선언된 클래스들 로드 하게 되기 때문에 별다른 클래서 생성이 필요 없이 사용이 가능하다.  저걸 자바 기본 문법상으로 표현하면 아래와 같다. 

    
    [ 사용 예시 ]
    public class DiController {
    
    	@AutoWired
        private BeanA beanA;
        @AutoWired
        private BeanB beanB;
        
        public  DiController() {
        	BeanA tempBeanA = new BeanA(); 
            BeanB tempBeanB = new BeanB(); 
            
    	}
    }
    
     
    

     

    AOP

    bean 자체가 lifeCycle 을 가지고 있기 때문에 생성부터 소멸까지 확인이 가능하다. 일반적은 클래스 선언을 이용한 방식보다 좀더 관점에 따른 컨트롤이 가능하다. 다른 말로는 관점지향 프로그래밍 혹은 AOP 라고 하는데 @Aspect 어노테이션을 통해서 한클래스에 대해서 호출전 (@Before) ,  호출 이후 (@After ) , 정상적으로 반환한 이후 (@AfterReturning) , 예외발생이후(@AfterThrowing) , 메소드 실행 전후 (@Around) 등 타겟이 되는 메서드의 Aspect 실행 시점을 지정할수가 있다. 

     이런것을 왜 쓰는지 의아 할수 있지만 대표적인 경우가 로깅 하거나 디버깅할때 아주 유용하다. 어떤 요청이 오는지 미리 기록하거나 처리 다한이후 후처리 작업이 필요한경우 AOP 를 통해 유연하게 대처가 가능하다. 그렇기 때문에 필수적으로 스프링을 사용하는 사람이라면 개념을 이해 하고 있어야 한다. 

     

    POJO , DI , AOP 등을 처음에는 spring framework 에 선언되있는 xml 을 통해서 공부 했었고 1년동안은 제대로 이해를 못하고 사용 했던것 같다. 일단 xml 로 되있는것들은 가독성이 너무 않좋고 spring framework 자체가 설정이 너무 복잡한것도 한몫을 한다.  지금은 spring boot 라는 좋은 대안과 좋은 교재가 생겼고 spring boot 를 이용해서 만들어진 프로젝트들의 java config 를 잘 분석하고 공부하면 충분히 쉽게 이해할 여지가 많이 생겼다고 생각한다.

    잊지 않기 위해 블로그에 기록을 기본적인것들도 하나 하나 정리를 열심히 해야겠다. 

     

    반응형
Designed by Tistory.