다운로드 : https://www.h2database.com h2.bat 경로 : C:\Program Files (x86)\H2\bin 설치후 h2.bat 실행 (윈도우 기준) h2.bat 켜놓고 끄면 db가 죽어버리기 때문에 항상 켜둬야 함. 최초에는 데이터베이스 파일을 만들어야 해서 ~/test, 즉 내 home에 이쓴 test파일을 말한다. home 경로 : C:\Users\wu2ee 연결을 누르면 빨간 네모로 표시된 부분을 클릭하면 다시 나가진다. 이 페이지가 뜨면서 home에 test.mv.db가 만들어진다. 이후에 연결을 할때, JDBC URL에 ~/test 이렇게 파일로 접근하게 되면 어플리케이션이랑 웹콘솔이 동시에 접근이 안되고 파일이 충돌나면서 오류가날 수 있기 때문에 위 그림과 같이 접..
이번엔 회원 등록을 만들자. 우선 멤버 컨트롤러에 createForm 메서드를 만든다. 그리고 templates안에 members라는 폴더를 만들고 createMemberForm.html을 만든다. 잘 나온다. 페이지 소스 보기를 하면 우리가 작성한 html 소스코드가 렌더링 된다. html에 form으로 묶여있는데, 웹에서 spring이라고 친다면 post로 {name : spring} 으로 날아가게 된다. MemberForm 클래스를 만들고 private String name; 을 선언하면 name 에 아까 등록한 이름인 'spring'이 들어가게 된다. 이렇게 까지 하고 돌리면 회원 가입까지는 된다. 이제 회원이 가입 됬는지 목록을 만들면 'spring'이 잘 등록 됬는지 확인할 수 있다. 동작 방..
이제 멤버컨트롤러를 통해 회원을 등록하고 조회하는 걸 만들어보자. HomeController를 생성한다. home.html을 생성한다. 실행해보면 우리가 만든 home.html이 뜬다. 회원 가입을 누르면 아직 페이지를 만들지 않아서 에러뜸. 근데 우리가 예전에 Welcome Page로 localhost 8080에 접근시 index.html을 반환했는데 어떻게 저게뜨는걸까? 우선순위가 존재함. 정적 컨텐츠반환시 스프링 컨테이너에 관련 컨트롤러가 있는지 찾고 없을때 정적 컨텐츠를 반환한다. Welcome page도 마찬가지다. 지금의 경우 localhost:8080 요청이 들어왔는데 이렇게 맵핑된게 있기 때문에 바로 이 컨트롤러가 호출되고 끝나는거다. 그래서 기존의 index.html은 무시된다. 출처 :..
이번에는 @Autowired말고 하나하나 직접 스프링 빈에 등록해보자. HelloController를 제외하고 MemberService, MemberRepository의 @Service, @Repository, @Autowired를 모두 지운다. 이 상태로 실행하면 당연히 스프링이 올라올때 컴포넌트 스캔이 안되서 스프링빈에 등록되지 않는다. 따라서 hellospring 패키지에 SpringConfig 클래스를 하나만들고 @Configuration 애노테이션을 붙인다. 그 다음 memberService와 memberRepository 메서드를 만들고 @Bean 애노테이션으로 스프링 빈 등록한다. 이때 MemberService 생성자로 MemberRepository 파라미터가 필요하므로 밑에 선언한 Memb..
이제 우리가 만든것을 화면에 붙이고 싶다. 그럼 컨트롤러와 뷰 템플릿이 필요하다. 회원가입하고 회원가입된것을 html로 뿌려주는 것들을 할거다. 이런걸 하려면 멤버 컨트롤러를 만들어야하는데, 이 멤버컨트롤러가, 멤버서비스를 통해서 회원가입하고, 멤버서비스를 통해서 데이터를 조회할 수 있어야 한다. 이거를 서로 의존관계가 있다고 한다. (멤버 컨트롤러가 멤버 서비스를 의존한다고 표현한다.) 이 작업을 스프링스럽게 해보자. 우선 멤버 컨트롤러를 만든다. 이렇게만 하면, 내용은 없지만 스프링이 처음 실행될때, 스프링 컨테이너라는 통이 생기는데, 거기에 @Controller 애노테이션이 붙으면 이 멤버 컨트롤러를 객체로 생성해서 스프링에 넣어두고 스프링이 관리를 한다. 우리가 앞시간에 실습했던 HelloCont..
전에는 test 폴더의 hellospring에 repository 패키지를 직접만들어서 클래스파일을 만들었는데, 단축키를 사용하면 쉽게할 수 있다. 테스트하고자하는 클래스에서 ctrl + shift + t 누르면 바로 테스트 파일을 만들 수있다. MemberService뒤에 Test가 자동적으로 붙는다. 밑에 체크박스 3개만 체크해서 OK누르면 자동적으로 똑같은 패키지의 폴더와 파일이 생성된다. 테스트코드는 사실 한글로 과감하게 바꿔도 된다. 프로덕션 코드가 나가는것은, (실제 테스트코드를 제외한) 한글로 이름적기가 되게 애매한데 (관례상으로도 한글로 쓰기 애매함) 뭐 우리가 영어권 사람들과 일하는게 아니면 바로바로 직관적으로 쉽게 알아들을 수 있으니까 한글도 많이 쓴다. 그리고 빌드 될때 이 테스트 코..
멤버서비스 클래스는 회원 리포지토리와 도메인을 이용해서 실제 비즈니스 로직을 작성하는 부분이다. 우선 회원가입을 만들자. package hello.hellospring.service; import hello.hellospring.domain.Member; import hello.hellospring.repository.MemberRepository; import hello.hellospring.repository.MemoryMemberRepository; import java.util.Optional; public class MemberService { //! 우선 서비스를 만들기 위해 회원 리포지토리가 필요하다. private final MemberRepository memberRepository = ..
test 폴더에 똑같은 repository 패키지를 만들고 MemoryMemberRepositoryTest 클래스를 만드는게 일반적이다. hello.hellospring.repository의 MemoryMemberRepositoryTest 클래스 package hello.hellospring.repository; import hello.hellospring.domain.Member; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; class MemoryMemberRepositoryTest { // 얘는 굳이 public으로 안해도 된다. 다른데서 쓸게 아니니까 MemberRepository repository = ne..
우선 domain 패키지에 Member 클래스를 만들자. [hello.hellospring.domain의 Member클래스] package hello.hellospring.domain; public class Member { private Long id; private String name; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } 그리고 repository 패키지에 MemberRepository 인터페이스를 만들자. package..
데이터: 회원ID, 이름 기능: 회원 등록, 조회 아직 데이터 저장소가 선정되지 않음 (가상 시나리오) 컨트롤러 : 웹 MVC의 컨트롤러 역할 서비스 : 핵심 비즈니스 로직 구현 리포지토리 : 데티어베이스에 접근, 도메인 객체를 DB에 저장하고 관리 도메인 : 비즈니스 도메인 객체, ex) 회원, 주문, 쿠폰 등등 주로 데이터베이스에 저장하고 관리됨 클래스 의존 관계 아직 데이터 저장소가 선정되지 않았으니 우선 인터페이스로 구현 클래스를 변경할 수 있도록 설계한다. 이때 데이터 저장소는 RDB, NoSQL 등등 다양한 저장소를 고민중인 상황으로 가정함. 개발을 진행하기 위해서 초기 개발 단계에서는 구현체로 가벼운 메모리 기반의 데이터 저장소를 사용한다. (이때 나중에 JDBC 데이터베이스를 사용하게 될 ..
API 정적 컨텐츠를 제외하고 2가지만 기억하면 된다. html을 변환해서 줄것인가, 데이터형식으로 바로 보내줄것인가!! 컨트롤러에 하나 더 추가했다. 이때 가장 중요한게 @ResponseBody 이다. 이게 뭐냐면 html에 나오는 바디 태그를 얘기하는게 아니라 HTTP에서 헤더와 바디부분이 있다. (HTTP 통신 프로토콜 부분이 그렇게 되어 있음) 그 BODY부분에 이 data를 내가 직접 넣어주겠다는 뜻이다. (응답 바디 부분에 직접 넣어주겠다는 것임) 여기서 name에 spring을 줬다면? hello spring 이라는 문자로 바뀌고 이 문자가 요청한 클라이언트에게 그대로 내려간다. 이게 템플릿 엔진과의 차이가 뭐냐면 View 이런게 없고 그냥 문자가 그대로 내려간다. 뭔가 느낌적으로 폰트가 달..
MVC와 템플릿 엔진 MVC : Model, View, Controller Controller @Controller public class HelloController { @GetMapping("hello-mvc") public String helloMvc(@RequestParam("name") String name, Model model) { model.addAttribute("name", name); return "hello-template"; } } View (resources/template/hello-template.html) hello! empty 과거에는 컨트롤러와 뷰가 따로 분리되어있지 않았음. 뷰에서 모든걸 다했다 (JSP기반에서 ← 소위 모델 1 방식이라고 부름) 지금은 MVC 스타일로..