지난 시간에 프로젝트를 생성하고, MVC 패턴에 대한 이해를 했다.
그래서 이제 데이터베이스를 연결해보고 회원가입을 구현해보려고 한다.
또한, 블로그를 참조하며 MVC 패턴에 맞게 패키지 구성을 어떻게 하는지에 대해서도 공부하였다.
우선, 기존에 Oracle은 사용했던 경험이 있으니 이번엔 Mysql DB를 연결해보도록 하겠다.
우선 Mysql을 설치해야하는데, 이는 도움을 얻은 곳을 통해 차근차근 설치하였다.
내 컴퓨터가 느린것도있고 하니 조금 오래걸렸다..
그리고 Mysql Workbench를 통해 테이블을 생성하였다.
기존에 내가 생성하려했던 테이블 create문은 바로 아래와 같다.
create table user( id int(10) not null auto_increment, password varchar(15), name varchar(10) default null, email varchar(15) unique key, phone varchar(20), primary key(id) );
근데 workbench를 통해 테이블 데이터를 생성하니 훨씬 더 웅장한 쿼리문으로 생성하더라
CREATE TABLE `user` ( `id` int NOT NULL AUTO_INCREMENT, `password` varchar(15) COLLATE utf8_bin DEFAULT NULL, `email` varchar(15) COLLATE utf8_bin NOT NULL COMMENT '유저 이메일, 아이디로 쓸 것임', `name` varchar(15) COLLATE utf8_bin DEFAULT NULL COMMENT '유저 이름', `phone` varchar(15) COLLATE utf8_bin DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `email_UNIQUE` (`email`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin COMMENT='유저 테이블\nid(auto increment), pw, name(성명), email (아이디로 쓸 것), phone(휴대폰번호)'
조금 더 믿음직스럽다 ㅋㅋ
그리고 이제 spring boot의 설정을 변경해주어야 한다.
첫 번째, build.gradle 파일의 dependency를 수정하자.
build.gradle
dependencies { implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' runtimeOnly 'mysql:mysql-connector-java' // ----->> 이 줄을 추가했다. testImplementation 'org.springframework.boot:spring-boot-starter-test' }
두 번째, applications.properties 파일에 해당 코드를 추가하자
applications.properties
spring.datasource.username=root spring.datasource.url=jdbc:mysql://localhost:3306/myinsta_db?characterEncoding=UTF-8&serverTimezone=Asia/Seoul spring.datasource.password=*Root@inseong***111
내 개인 프로젝트니까 비밀번호를 공개해도 상관이 없지만 다른 중요한 프로젝트거나 깃허브에 올릴 땐 password를 가리고 올리자!
나는 패키지를 다음과 같이 구성했다.
인프런에서 강의를 들을 때, 기본적으로 패키지를 이렇게 나누고 시작하더라
오늘 나는 우선 회원가입 화면에서 form태그로 서버에 데이터를 전송하여, 회원 가입하는 것을 목표로 도전하겠다.
JDBCTemplate은 기존 JDBC 라이브러리에서 쿼리에 앞서 DB Connection 같은 무수히 반복되는 코드를 줄여주는 Spring에서 지원하는 Template이다.
학부생 때 JDBC 라이브러리로 회원서비스를 구축하며 굉장한 하드코딩을 했던 기억이 남기 때문에, 굳이 다시 체험하고 싶진 않아서 JDBCTemplate으로 바로 대체하려했다.
우선, 클라이언트에서 요청을 보낸다. html의 form태그를 통해 입력받은 값을 서버로 전송한다.
이렇게 ㅋㅋ.. front가 없다보니 매우 빈약한 View다 ...ㅎ
회원가입을 클릭하면 HomeController에서
@ModelAttribute 어노테이션을 통해 UserForm에다가 받아온 데이터를 담아 user에 입혀준다.
이때 주의해야 할 것은 html에서 form 태그 안에있는 태그의 name과 UserForm의 멤버변수의 변수이름을 맞춰줘야 한다는 것이다.
하지만 왜 UserForm에 데이터를 담아주어야 하는지는 아직 공부 과제다. 이에 대한 설명은 링크 에서 나중에 확인하자!
서로 name이 일치하는 것을 확인할 수 있다.
User를 만들어서 join을 시키게 되면 아래와 같은 로직으로 흘러들어온다.
너무 인프런 강의를 따라하는 것 같아서.. 변명을 하자면 findByEmail로 null을 받았을 때, 즉 해당 이메일의 유저가 없을 때 회원가입을 시켜주기 위해 if(findByEmail(user.getEmail()) == null) 을 썼다가 NoSuchElementException 에러가 발생했다.
Optional이라는 Null을 잘 처리해주는 아이를 두고 내 마음대로 할려다가 이런 오류를 마주했고, 구글링을 해보니 ifPresent를 사용하라더라.
근데 이걸 또 쓰는 방법을 모르다보니 강의자료를 훔쳐보게되었다.
이를 사용해야하는 이유를 알게된 것으로 만족한다! 이것 또한 공부니까
그리하여 이제 메모리 처리소인 repository의 로직
을 통해 성공적으로 data를 insert하게 되었다.
삽입 확인
어.. 근데 id가 줄어들진 않네..? AutoIncrement를 좀 손봐야겠다..
이번에 이 과정을 통해 스프링은 뭔가 굉장히 방법이 다양하다는 것을 느꼈다.
나는 그 중에 최선의 선택을 정할 줄 아는 사람?이 뭔가 스프링을 잘 이해하는 사람이 아닐까 싶다.
그리고 자바 문법에 대해 한없이 부족하구나를 느꼈다. 람다식을 많이 공부해보면 좋을 것 같다.
안녕하세요 글 잘 읽었습니다. 인프런 어떤 강의 수강하셨는지 알 수 있을까요?