스프링 입문-01_기초

junkyu lee·2022년 5월 25일
0

Spring

목록 보기
2/6

https://www.inflearn.com/course/스프링-입문-스프링부트 강의를 듣고 작성한 노트


프로젝트 생성

spring initialize

https://start.spring.io/

project

  • 필요 라이브러리, 빌드 라이프 사이클 관리

  • Maven Project : 옛날

  • Gradle Project : 요새 다 이거 씀

Project Metadata

  • Group : 도메인 명

Dependencies : 라이브러리

  • Thymeleaf : 템플릿 엔진
  • Spring Web : 스프링

프로젝트 폴더 구조

-.idae : d인텔리 j 설정파일

build.gradle

  • 설정 파일

  • repositories : 라이브러리 설치

  • dependencies : 라이브러리


에러1.

Process 'command '/Library/Java/JavaVirtualMachines/jdk-17.0.2.jdk/Contents/Home/bin/java'' finished with non-zero exit value 1

  • 환경설정(cmd + ',') > 빌드, 실행, 배포 > 빌드 도구> Gradle > 빌드 및 실행
  • 다음을 사용하여 빌드 및 실행, 테스트를 Gradle에서 IntelliJ IDEA로 변경

라이브러리 살펴보기

디펜던시

  • 특정 라이브러리를 가져올때 의존 관계의 라이브러리를 모두 가져옴

  • 웹서버를 내장한 소스코드(라이브러리 형태로 ex. Tomcat)

  • 로그(logback), 테스트(junit5)

*참고


@GetMappibg :Get 방식

model.addAttribute("data", "hello!!")

return : html 명
model : 전송 데이터

html에서 데이터의 키 값으로 값을 가져올 수 있다


$ ./gradelw build 
# 서버 빌드
$ java -jar ./build/libs/hello-spring-0.0.1-SNAPSHOT.jar
# 서버 실행

$ ./gradelw clean
# 빌드된 서버 삭제

$ ./gradelw clean build
# 빌드된 서버 삭제 후 재 빌드

스프링 웹 개발 기초

  1. 정적 컨텐츠
  2. 동적 컨텐츠 : MVC, 템플릿 엔진
  3. API : 데이터를 전송하면 클라이언트가 알아서 화면을 그려주는 방식
  1. 정적 컨텐츠
    미리 작성한 html문서를 전송하여 그려주는 방식

  2. 동적 컨텐츠

    MVC : model view controller

    (mapping에 hello-mvc는 안됨, "-" 문자가 문제)
    template엔진을 MVC 방식으로 사용하여 html을 로직을 거쳐 가공한 후에 클라이언트에 전송하는 방식

  1. API
    @ResponseBody : http의 바디에 데이터를 넣어준다는 의미
    객체는 json 방식으로 전달

    (cmd + N : getter and setter, 자바 bin 방식 자동 설정 )

    • @ResponseBody 사용 원리

      Jackson : spring에서 json을 읽을때 사용하는 라이브러리


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

DB는 미정이라 인터페이스 : 추후 결정된 DB로 변경하기 위해
유저 관리, 조회
데이터: 회원ID, 이름

Optional : Null 값을처리하기 위함

저장을 위해 map 사용

HashMap : 실무에서는 동시성 문제로 다른 걸 사용해야함 우선은 단순하게

  1. test case
    JUint
    주피터의 assertions : assertEqual
    core의 assertions : assertThat

    변수명 한번에 바꾸기 shift + f6

    @AfterEach : 테스트 하나가 끝날때 마다 실행되는 어노테이션. 여기서는 저장소를 clear해줌

    • 테스트 방법
  • 테스트가 완료되면 초록 체크

3. 4 회원 서비스

  • 회원 가입, 중복 이름
    • Cmd + opt + v
    • null이 아니면 ifPresent( )
    • Ctrl + t > Extract Method : 새로운 메소드로 만들기
    • service 모듈은 비즈니스에 가깝게 설계 (명칭 등)

3.5 회원 서비스 테스트

  • cmd + shift + t : 새로운 테스트 모듈 생성

  • 테스트 모듈의 메소드는 마음것 한글명으로 바꿔도 상관없음, 빌드 될때 포함 안됨

  • 테스트 문법

    /*given
    	검증 데이터
    */
            
    /*when
      검증 로직
    */
    
    /*then
    	검증 부분 
    */

테스트 모듈에서 new로 새로운 repo를 생성하면 memberService의 repo와 다른 인스턴스임
두 인스턴스에서 사용하는 store가 static이 아닐경우 서로 다른 저장소에 저장하는게 돼버림
@BeforeEach를 통해 테스트에서 생성할 memberService와 repo를 독립적으로 만들어줌

 @BeforeEach
 public void beforeEach() {
     memberRepository = new MemoryMemberRepository();
     memberService = new MemberService(memberRepository);
 }

4. 스프링빈과 의존관계(DI)

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

  • 컨트롤러 모듈이 서비스 모듈을 통해 서비스 제공
  • @Controller : 스프링 컨테이너가 맴버 객체를 생성해서 스프링에 넣어 놓는다..
  • @Autowired : 스프링이 해당 객체를 스프링 속의 객체(스프링 빈)와 연결을 해준다
  • @Repository, @Service : 스프링이 해당 코드를 객체로 인식하기 위한 에노테이션
@Controller
public class MemberController {

    private final MemberService memberService;

    @Autowired
    public MemberController(MemberService memberService) {
        this.memberService = memberService;
    }
}

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

  1. 컴포넌트 스캔과 자동 의존관계 설정
    @Service, @Controller,@Repository 는 @Component를 포함하여 자동으로 컴포넌트 스캔이 됨...

    • @Component 애노테이션이 있으면 스프링 빈으로 자동 등록된다.

    • 스프링 빈으로 등록되려면 HelloSpringApplication.java 의 하위 디렉토리의 클레스들만 가능(기본 옵션으로는)

    • 스프링 빈에는 기본으로는 싱글톤 : 하나의 인스턴스만 등록된다.

4.2 자바 코드로 직접 스프링 빈 등록하기

@Configuration
public class springConfig {

    @Bean
    public MemberService memberService() {
        return new MemberService(memberRepository());
    }

    @Bean
    public MemberRepository memberRepository(){
        return new MemoryMemberRepository();
    }
}

DI 주입 방법 : 필드, setter, 생성자 주입 3가지

  • 필드 : 다른 값을 넣을 수 없음

    @Autowired private MemberService memberService;
  • setter : 중간에 바꿀일 없는 DI가 public 하게 노출됨

    private MemberService memberService;
    
    @Autowired
    public void setMemberService(MemberService memberService) {
        this.memberService = memberService;
    }
  • 생성자 주입

    private MemberService memberService;
    
    @Autowired
    public MemberController(MemberService memberService) {
        this.memberService = memberService;
    }
  • 실무에서는 주로 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트 스캔을 사용한다.
  • 상황에 따라 구현 클래스를 변경해야 하면 설정을 통해 스프링 빈으로 등록한다.

MVC 화면 구성

home.html

  • Welcome page
    • 요청에 따른 우선순위
      1. 스프링 컨테이너 내부
      2. 외부 static 파일
    • html 또한 매핑된 html이 있다면 그 문서를, 없다면 index.html을
  • Form : method의 post 방식으로 매핑된 데이터를 서버로 전송함

    @PostMapping("/members/new")
    public String create(MemberForm form){
        Member member = new Member();
        member.setName(form.getName());
    
        memberService.join(member);
    
        return "redirect:/";
    }

    ​ MemberForm form : 전송 받은 데이터

    public class MemberForm {
        private String name;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }

​ name 에 들어감

5.2 member list

  • loop를 돌면서 model의 값을 출력
<tr th:each="member : ${members}">
    <td th:text="${member.id}"></td>
    <td th:text="${member.name}"></td>
</tr>
profile
가끔 기록하는 velog

0개의 댓글