
1. 쿼리 작성하기
- DB 폴더 생성하고 쿼리를 작성할 data.sql 파일 생성하기
- 테이블을 만드는 쿼리를 적어 놓기
→ 실행될 때마다 테이블이 만들어지고 insert가 되어 동일한 데이터가 생성됨
→ 테스트할 때 joinform이 아니라 loginform에서 바로 할 수 있음

insert into user_tb(username, password, email, created_at) values('ssar', '1234', 'ssar@nate.com', now());
insert into user_tb(username, password, email, created_at) values('cos', '1234', 'cos@nate.com', now());
2. yml에서 더미데이터 추가를 위한 설정하기
- 쉽게 제어가 가능
하면 user에 entity 만들 필요 없음
하지만 entity에서 테이블을 만드는 게 훨씬 편함
ex) 컬럼 명이 바뀌면 user에서도 고치고 sql에서도 고쳐야 함
server: servlet: encoding: charset: utf-8 # 문자 인코딩을 UTF-8로 설정 force: true session: # session 유지 시간 설정 timeout: 30m port: 8080 spring: mustache: servlet: expose-session-attributes: true # session에 속성 노출 설정 expose-request-attributes: true # session에 요청 속성 노출 설정 datasource: # H2 데이터베이스를 사용하는 설정 driver-class-name: org.h2.Driver url: jdbc:h2:mem:test;MODE=MySQL # 연결URL ; H2를 MySQL과 호환되도록 설정 username: sa # 사용자 이름 password: # 사용자 비밀번호 h2: console: enabled: true # 웹에서 콘솔에 접근할 수 있게 활성화 sql: init: data-locations: - classpath:db/data.sql #리소스 폴더(로케이션 파일이 여러개 일 수 있음)를 가리킴 jpa: hibernate: ddl-auto: create show-sql: true properties: hibernate: format_sql: true # 표기 방법 변경 defer-datasource-initialization: true # 데이터 소스 초기화를 지연
- 테이블이 만들어지고 insert되도록 설정할 것
- prod는 직접 다 만들어야 안전함

3. UserRepository에서 boolean findUserByUsername() 만들기
- username에 해당하는 데이터베이스 테이블에서 사용자를 검색
package shop.mtcoding.blog.user;
import jakarta.persistence.EntityManager;
import jakarta.persistence.Query;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
@Repository // 내가 new 하지 않아도 메모리에 띄울 수 있음
public class UserRepository {
private EntityManager em; // 컴포지션
public UserRepository(EntityManager em) { // 생성자
this.em = em;
}
// username에 해당하는 데이터베이스 테이블에서 사용자를 검색
public boolean findUserByUsername(String username) { // 생성자
Query query = em.createNativeQuery("select * from user_tb where username=?", User.class);
query.setParameter(1, username);
try {
User user = (User) query.getSingleResult();
return true; // 있음
} catch (Exception e) {
return false; // 없음
}
}
@Transactional // DB에 변경을 초래할 떄 사용
public void save(UserRequest.JoinDTO requestDTO) { // 컨트롤러는 정보를 전달하면서 때리고 위임함
System.out.println("UserRepository에 save메서드 호출됨");
Query query = em.createNativeQuery("insert into user_tb(username, password, email) values (?, ?, ?)");
query.setParameter(1, requestDTO.getUsername());
query.setParameter(2, requestDTO.getPassword());
query.setParameter(3, requestDTO.getEmail());
query.executeUpdate();
}
// select문은 @Transactional 안해도 됨
public User findByUsernameAndPassword(UserRequest.LoginDTO requestDTO) {
System.out.println("UserRepository에 findByUsernameAndPassword메서드 호출됨");
Query query = em.createNativeQuery("select * from user_tb where username=? and password=?", User.class); // 알아서 매핑해줌
query.setParameter(1, requestDTO.getUsername());
query.setParameter(2, requestDTO.getPassword());
try { // 내부적으로 터지면 터지는 위치를 찾아서 내가 잡으면 됨
User user = (User) query.getSingleResult();
return user;
} catch (Exception e) {
return null;
}
}
Share article