https://www.inflearn.com/course/스프링-입문-스프링부트 강의를 듣고 작성한 노트
spring initialize
project
필요 라이브러리, 빌드 라이프 사이클 관리
Maven Project : 옛날
Gradle Project : 요새 다 이거 씀
Project Metadata
Dependencies : 라이브러리
프로젝트 폴더 구조
-.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
디펜던시
특정 라이브러리를 가져올때 의존 관계의 라이브러리를 모두 가져옴
웹서버를 내장한 소스코드(라이브러리 형태로 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
# 빌드된 서버 삭제 후 재 빌드
- 정적 컨텐츠
- 동적 컨텐츠 : MVC, 템플릿 엔진
- API : 데이터를 전송하면 클라이언트가 알아서 화면을 그려주는 방식
정적 컨텐츠
미리 작성한 html문서를 전송하여 그려주는 방식
동적 컨텐츠
MVC : model view controller
(mapping에 hello-mvc는 안됨, "-" 문자가 문제)
template엔진을 MVC 방식으로 사용하여 html을 로직을 거쳐 가공한 후에 클라이언트에 전송하는 방식
API
@ResponseBody : http의 바디에 데이터를 넣어준다는 의미
객체는 json 방식으로 전달
(cmd + N : getter and setter, 자바 bin 방식 자동 설정 )
@ResponseBody 사용 원리
Jackson : spring에서 json을 읽을때 사용하는 라이브러리
DB는 미정이라 인터페이스 : 추후 결정된 DB로 변경하기 위해
유저 관리, 조회
데이터: 회원ID, 이름
Optional : Null 값을처리하기 위함
저장을 위해 map 사용
HashMap : 실무에서는 동시성 문제로 다른 걸 사용해야함 우선은 단순하게
test case
JUint
주피터의 assertions : assertEqual
core의 assertions : assertThat
변수명 한번에 바꾸기 shift + f6
@AfterEach : 테스트 하나가 끝날때 마다 실행되는 어노테이션. 여기서는 저장소를 clear해줌
테스트가 완료되면 초록 체크
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.1 컴포넌트 스캔과 자동 의존관계 설정
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
스프링 빈을 등록하는 2가지 방법
컴포넌트 스캔과 자동 의존관계 설정
@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
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
<tr th:each="member : ${members}">
<td th:text="${member.id}"></td>
<td th:text="${member.name}"></td>
</tr>