[백엔드] 스프링 개발 입문 느낀점 및 요약

유승선 ·2022년 6월 3일
1

Spring 강의

목록 보기
1/12
post-thumbnail

스프링 입문 강의를 끝냈다. 5시간 21분 밖에 안되는 총 강의 양이지만 미루고 미루고 좀 게으르게 하다보니깐 이렇게 밖에 못했다. 강의를 한번에 듣는게 아닌 자꾸 여러 단계로 끊다 보고 하다보니깐 점점 어떤 내용인지 모를정도로 그냥 받아쓰기 하는 것처럼 코드를 쓰게되서 많은 흥미를 잃게 된것일수도 있다. 그렇기 때문에 오늘은 강의 내용을 섹션 별로 나눠서 나만의 요약법을 간단히 쓰고 이제 핵심 내용으로 넘어가게되면 좀 더 깊이 있게 따라 해보고싶다.

프로젝트 환경 설정

프로젝트 생성 및 라이브러리 살펴보기

  • 기본적으로 프로젝트를 생성하는 방법이다. https://start.spring.io 에 들어가서 Gradle Project 를 선택하고 Dependencies 에서 Spring Web, Thymeleaf (HTML 만들어주는 템플릿 엔진) 를 넣어주면 된다.

  • Generate 버튼을 눌러 파일을 다운로드 한뒤에 압축을 풀고 IntelliJ 에서 Open or Import -> build.gradle 선택 후 오픈하면 된다.

  • Gradle 은 의존관계가 있는 라이브러리를 함께 다운로드 한다. (예: spring-boot-starter-web -> tomcat 등등)

View 환경설정

  • main에 있는 resources 파일에 들어가서 static 파일을 눌러준후에 index.html 파일을 생성해준다.

  • 웹어플리케이션의 첫 진입점은 @Controller 이라는것이다.
  • @GetMapping("hello") 라는 문구는 어플리케이션에서 /hello 가 들어오면은 이 코드가 실행이 된다
  • Model 은 MVC의 기본이 되는것이며, addAttribute("data", "hello!") 같은 경우 thymeleaf 와 연계해서 사용할수있다.

  • 위와 같이 model 에서 패스된 "data" 값이 thyleaf 로 이동했다.

  • 기본적인 동작 원리이다. 웹 브라우저가 localhost:8080/hello 를 입력하게 되면 스프링 부트는 컨테이너 안에서 hello라는 이름의 @Controller 을 호출하고 우리의 컨트롤러는 hello 값을 리턴하면서 viewResolver 가 resources -> templates -> hello.html 을 찾는다. 그렇기 때문에 model.addAttribute(a,b) 해서 넘긴 값이 data 값 안에 성공적으로 입력이 됐다.

스프링 웹 개발 기초

정적 컨텐츠

  • 어떠한 개입 없이 static 안에 있는 html 파일을 그대로 불러온다.

  • 서버/static.html 을 부르면 -> 스프링은 hello-static 관련 컨트롤러를 찾지만 없기때문에 -> static 파일안에 있는 hello-static.html 을 열게 되는것이다.

MVC 템플릿 엔진

  • Model, View, Controller 구조이다

  • @RequestParam("name") 을 사용하게 되면 name variable에 저장이 되고 넘어간다

  • MVC, 템플릿 엔진 이미지는 이 전에 사용했던 이미지와 동일한 원리이다.

API

  • API 호출을 위해선는 @ResponseBody 가 필수로 들어가야한다

  • @ResponseBody 를 사용하면 viewResolver 을 사용하지 않고 HTTP 의 BODY에 문자내용 그대로 입힘. 즉, template 과정을 거치지 않음.

  • @ResponseBody 는 객채 (object) 를 JSON 방식으로 리턴할때 가장 쓰임새가 높다.

  • 사용원리:

요약: Controller 확인 -> viewResolver 대신 HttpMessageConverter 동작 -> 문자 or 객채 따라 converter가 다르다.

회원 관리 예제 - 백엔드 개발

  • 각자의 폴더에 설명에 나와있는 로직들이 구현될것이다

  • 해당 강의에서는 이런식으로 설계가 되어있다.
  • https://mungto.tistory.com/314 인터페이스에 용도는 여기에 더 깊게 적혀있는데 쉽게 말해 다른 클래스들이 쉽게 method 들을 상속 할수있게 만들어지는것이라고 한다

회원:

회원 리포지토리 인터페이스

  • Optional은 Null 값을 처리해주기 위해 쓰이는거라한다

회원 리포지토리 메모리 구현체


회원 리포지토리 메모리 구현체 테스트

  • src/test/java 하위 폴더 생성한다

  • 테스트 케이스 작성 예시
    • 특이하게 볼것은 @Test -> 바로 테스트할수있다
    • assertThat(result).isEqualTo(member) -> 두 값을 비교하는 자바 method (이건 좀 배울 필요가있다)
    • @AfterEach: 한번에 여러 테스트를 실행하면 메모리 DB에 전 테스트 케이스 결과가 남을 수있는데 이러면 다음 테스트 케이스를 실패할수있다. 그렇기 때문에 각 테스트 케이스가 종료될때마다 이 기능을 이용해서 DB에 저장된 데이터를 삭제해준다

회원 서비스 개발

  • 조금 헷갈릴수도 있는 코드지만 자바만 이해한다면 쉬운 코드이다
  • Ctrl + Alt + Shift + T 를 이용하여 method를 extract 할 수도 있다.

회원 서비스 테스트

  • Ctrl + Shift + T 를 이용하여 쉽게 테스트케이스를 만들수있다

  • Dependency Injection -> 외부에서 객체를 그대로 넣어주는것

  • 회원 서비스가 직접 메모리 회원 리포지토리를 생성했는데 이는 테스트케이스에서도 동일하게 하게된다면 서로가 다른 리포지토리 (DB) 에서 테스트를 실행하는 모습이다. 이런류의 코드는 나중에 문제가 될수 있으므로 DI를 통해 MemberService 가 직접적으로 DB 객체를 만들지 않도록 해주었다.


컴포넌트 스캔과 자동 의존관계 설정

  • 멤버 컨트롤러가 서비스와 리포지토리를 사용할수 있어야 하는데 이것을 의존관계 라고 한다.

  • 컨트롤러는 기본적으로 컨테이너가 관리를 한다

  • 컨트롤러 안에서도 new 를 써서 객채를 사용할수는 있다, 그러나 이 말은 다른 컨트롤러도 같은 객체를 사용할수있다는 뜻이고 하나만 생성해서 가지고 운영하는게 중요하다

  • 스프링 컨테이너에 등록을 하는게 우선순위이다

그러나 단순히 이렇게 쓰면은 에러가 나오는데,

  • 이유는 memberService 는 컨테이너에 등록되지 않은 순수한 자바 코드이기 때문이다. @Controller 가 있다면 자동등록이 된다.

스프링 빈을 등록하는데는 2가지 방법이 있는데

  • 컴포넌트 스캔과 자동 의존관계 설정

    • 이런 원리가 Dependency Injection 이다
    • 컨트롤러 뿐만 아니라 다른 클래스에서도 @AutoWired 를 이용해서 연결해줄수있다.
  • 자바 코드로 직접 스프링 빈 등록하기

    • @Bean 을 쓰면 등록을 해준것이다
    • 여러 다른 방법의 DI 주입 방법이 있지만 좀 더 공부가 필요할것이다.

회원 관리 예제 - 웹 MVC 개발

회원 웹 기능 - 홈 화면 추가

  • 컨트롤러 파일이 정적 파일보다 우선순위가 높기때문에 홈으로 추가한 컨트롤러가 먼저 열리는것이다

회원 웹 기능 - 등록

  • Member 을 따로 관리하고 싶었기에 회원 폼 등록 HTML 을 createMemberForm 이라는 폴더에 따로 넣어주었다.

  • 유심히 봐야할것중 하나는 form action = "members/new" method = "post" 인데 name = "name" 이라 적힌 부분이 서버로 넘어올때 key 가 된다.

  • 폼을 만드는 html 을 끝내놨으니 이제 컨트롤러를 등록해야 한다. 회원가입을 누른 순간 -> /members/new 로 이동을 했고 GetMapping(/members/new) 로 인해 폼을 등록하는 HTML 이 열린것이다. 해당 HTML 폼에서 이름을 입력하면 key 와 value 가 스프링으로 넘어 가게된다.

  • @PostMapping(/members/new) 를 적었기때문에 value 가 이쪽으로 넘어갔고 새로운 member 을 만든 다음, 멤버에 setName 을 form.getName() 으로 이름을 가져오고 멤버 서비스에 조인을 하게 해주었다.

-@PostMapping(/members/new) 로 넘어오게 되고 create(Memberform form) 에서 멤버 폼을 설정해주면서 HTML 에서 넘어오게 한 name 이라는 변수가 그대로 스프링이랑 같이 MemberForm 으로 넣게된다. setName이 호출이 되가지고 this.name = name 과정에서 name이 설정 되었다.


회원 웹 기능 - 조회

  • @GetMapping() 을 통해 member List 를 만든다음에 model 에다가 addAttribute 해서 그대로 HTML 파일로 넘겼다.

  • <th:each = "member : ${members}"> 가 보이는데 이거는 타임리프에서 제공하는 코드이고 모델 안에 있는 멤버스 리스트를 루프로 읽는것이다.

스프링 DB 접근 기술

스프링 DB 같은 경우는 너무 토픽이 방대하고 JDBC, H2 같은건 나중에 더 배울수 있기때문에 JPA 관련된것만 포스팅 해본다

JPA

  • JPA 는 기존의 반복 코드는 물론, 기본적인 SQL 도 JPA가 직접 만들어서 실행해준다
  • JPA 를 사용하면 SQL 과 데이터 중심의 설계에서 객체 중심의 설계로 패러다임을 전환을 할 수 있다

  • 기본 설정 방법들



JPA 엔티티 매핑


강의를 끝마치며

결론

처음으로 Spring 을 이용한 코드를 여러가지 적어보고 배웠는데 웹 프레임워크 경험으로는 Python Flask, Node JS Express 를 경험해봤기 때문에 금방 배울수 있겠지 라는 마인드로 시작했다.

그런데 내가 생각했던것보다 Spring 은 더욱 복잡했고 지금 요약본이라고 적은 이 계시글에도 많이 생략된게 JPA, JDBC, 그리고 AOP 가 있다.

이번 강의만 봤을때는 좀 더 복잡하고 이해하기 힘들었기 때문에 다음 강의에서 더 깊이 있는 수업을 들으면서 이론을 더 빠삭하게 배우고 싶었다. 백엔드 부분에서 군대로 인해 학교에서 배운것도 그렇고 너무 많이 잊은것들이 많기에 스프링으로 천천히 하나하나 주입해서 배우고싶다.

아직 실무로 투입되기에는 너무 부족하다고 생각하기때문에 이력서에서도 그렇고 다음강의 까지는 다 들어야지 그나마 뭐라도 할수있을거라고 말 할거같다. 그래도 처음 강의 들었던거에 비하면 많이 이해가 됐어가지고 좀 게을러지지 않게 꾸준히 해보는게 좋을거같다.

좋은 강의를 들을수 있게 도와준 동생한테도 감사하게 생각한다.

다음 강의부터는 더 빠른 템포로 수업을 진행해야겠다.

profile
성장하는 사람

0개의 댓글