본문 바로가기

카테고리 없음

스프링 입문(1)

학기 중에 프론트엔드 화면 구성을 진행하면서 서버와의 통신, 데이터 관리 등에 대해서 더 알아가고 싶은
의문점들이 많았다. 아무래도 프론트 개발보다 백엔드 개발은 생소하다 보니 이번 방학을 통해 주로 사용하는
스프링에 대해서 공부하려고 한다.

 

  • intellij 사용
    • 본 강의에서는 IDE로 인텔리제이를 사용한다.
    • Gradle 통해서 실행하는 것보다 intellij로 자바를 직접 실행하는 것이 더 빠르다.

 

  • Gradle 이란? 
    • gradle은 의존 관계가 있는 라이브러리들을 함께 끌어오는 것으로 생각하면 된다.
      • 프론트 개발 시에 yarn이나 npm으로 여러 라이브러리들을 다운 받았었는데
        그런 개념으로 생각했다.
      • 본 강의에서는 타임리프 템플릿 엔진 / 톰캣(웹서버) / junit 테스트 라이브러리를
        주로 사용한다.

 

<동작 환경>

웹 브라우저 -> 내장 톰캣 서버 -> 컨트롤러 -> 뷰 리졸버 -> 웹 브라우저 이런 식으로 흘러간다.

 

큰 그림은 이런 느낌으로 기억해두자

 

위 그림은 MVC를 직접 그리면서 이해해본 결과물이다.

 

  • API
    • 여기서 API를 사용하면 뷰 리졸버 대신 데이터를 직접 반환한다.
    • JSON 이라는 형식에 맞추어서 데이터를 전달한다.
    • @ResponseBody를 사용

 

  • 패키지 구성
    • 컨트롤러: 웹 MVC의 컨트롤러
    • 서비스: 비즈니스 로직
    • 레포지토리: DB접근
    • 도메인: 객체
  • junit 테스트
    • GUI 프로그래밍 했을 때 사용했던 방법과 유사하다.
    • 다만 @AfterEach를 사용해서 테스트 종료 시에 데이터를 삭제하여
      각 테스트의 독립성을 유지한다.
    • @BeforeEach 각 테스트 실행 전에 호출하여 항상 새로운 객체를 생성한다. => 의존 관계도 다시 맺음
@AfterEach //이걸 사용해야 1번 테스트 후에 2번 테스트를 진행해도 오류가 안 뜬다.
public void afterEach() {
repository.clearStore();
}
@Test
public void save() {
//given
  Member member = new Member();
  member.setName("spring");
//when
  repository.save(member);
//then
  Member result = repository.findById(member.getId()).get();
    assertThat(result).isEqualTo(member);
}
@Test
public void findByName() {
//given
  Member member1 = new Member();
  member1.setName("spring1");
  repository.save(member1);
  Member member2 = new Member();
  member2.setName("spring2");
  repository.save(member2);
//when
  Member result = repository.findByName("spring1").get();
//then
  assertThat(result).isEqualTo(member1);
}

TDD => 테스트 주도 개발 : 테스트 코드에 맞춰서 개발을 진행한다.

 

 

 

<DI => 의존성을 내가 직접 넣어준다. 의존성 주입 dependency injection>

-> @Autowired를 사용하면 스프링이 연관된 객체를 컨테이너에서 찾아서 넣어준다. (스프링이 주입해줌)

 

  • 스프링 빈으로 등록하는 2가지 방법
    • 컴포넌트 스캔
      • @으로 실행 / 컴포넌트를 스프링 컨테이너에 등록 후 연결
      • 해당 패키지와 하위 패키지에서만 컴포넌트 스캔을 실행한다.
      • 스프링은 스프링 컨테이너에 스프링 빈을 등록할 때, 기본으로 싱글톤으로 등록한다
        (유일하게 하나만 등록해서 공유한다) 따라서 같은 스프링 빈이면 모두 같은 인스턴스다. 
      • @Controller / @Service / @Repository
    •  자바 코드로 직접 스프링 빈 등록
      • 파일을 하나 만들어서 @Configuration을 사용하여 직접 등록한다.
      • @Bean으로 등록

 

=> 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트 스캔 사용

     상황에 따라 클래스를 변경해야 한다면 스프링 빈으로 직접 등록

/ @Autowired는 스프링이 관리하는 객체에서만 동작하고 내가 직접 생성한 객체에서는 동작하지 않는다.

 

 

DI:
필드 주입: 그냥 별로 안좋음
세터 주입: 아무나 메소드를 사용하게 되어서 수정 가능성이 크다.
생성자 주입: 제일 권장하는 방식

 

참고: 컨트롤러가 정적 파일보다 우선순위가 높다.

 

  • @PostMapping

html form에서 method가 post이면 post방식으로 넘어가서

컨트롤러에서 @PostMapping과 매칭된다.

post는 보통 어떤 형식에 넣어서 데이터를 전달해서 등록할 때 post를 쓴다.

 

get은 어떤 정보를 조회할 때 사용한다.

 


 

다음엔 DB연결과 실습을 진행할 예정이다.