스프링인액션 책을 읽다가 JPA와 H2DB에 대해서 설정해서.. 이왕 설정한거 H2DB를 통해서 간단한 테스트를 하나 진행하면 좋을 것 같다.
package com.hongchelin.Domain;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import lombok.Data;
@Entity
@Data
public class Member {
@Id
@GeneratedValue(strategy = jakarta.persistence.GenerationType.IDENTITY)
private Long id;
private String name;
private String role;
private String refreshToken;
}
도메인을 세팅해준다.
Data 어노테이션은 Getter 어노테이션과 함께 몇 가지 기능이 더 추가된 어노테이션이라고 한다.
package com.hongchelin.Repository;
import com.hongchelin.Domain.Member;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import java.sql.ResultSet;
import java.sql.SQLException;
@Repository
public class MemberRepository implements MemberRepositoryInterface {
private JdbcTemplate jdbcTemplate;
@Autowired
public MemberRepository(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
@Override
public Iterable<Member> findAll() {
return jdbcTemplate.query("select id, name, role, refreshToken from Member",
this::mapRowToMember);
}
@Override
public Member findById(Long id) {
return jdbcTemplate.queryForObject(
"select id, name, role, refreshToken from Member where id=?",
this::mapRowToMember, id);
}
@Override
public Member save(Member member) {
jdbcTemplate.update(
"insert into Member (id, name, role, refreshToken) values (?, ?, ?, ?)",
member.getId(),
member.getName(),
member.getRole(),
member.getRefreshToken()
);
return member;
}
private Member mapRowToMember(ResultSet rs, int rowNum) throws SQLException {
return Member.builder()
.id(rs.getLong("id"))
.name(rs.getString("name"))
.role(rs.getString("role"))
.refreshToken(rs.getString("refreshToken"))
.build();
}
}
Repository는 이렇게 짜줬다.
각 명령문에 대한 설명은 [2025백엔드] 스프링인액션 독서 #3 - 데이터로 작업하기 참고
암튼 이를 연결해보자
우선 처음에 짰던 소셜로그인에 연동시켜보려한다.
MemberDTO memberDTO = MemberDTO.builder()
.identifier(id)
.userRole(ismember == true ? "inner" : "outer")
.accessToken(userToken)
.refreshToken(refreshToken)
.build();
if (ismember) {
responseDTO = ResponseDTO.builder()
.status(200)
.message("로그인 성공. 외부인 계정으로 로그인")
.redirectUrl("/")
.MemberInfo(memberDTO)
.build();
}
else {
responseDTO = ResponseDTO.builder()
.status(250)
.message("로그인 성공. 회원가입창 이동")
.accessToken(userToken)
.refreshToken(refreshToken)
.build();
}
그전에 기존 방식은 DTO를 쓰지않고 ResponseDTO에 인자로 role 등의 변수를 전달해서 좀 수정하고..
Member member = Member.builder()
.name("이름이름")
.role("inner")
.refreshToken(refreshToken)
.build();
memberRepository.save(member);
이렇게 저장하는 변수를 만들었다.
그런데..

엥? SQLException이 일어나서 살펴보니..
JDBC는 미리 내가 DB테이블을 설정해놔야한다..
참고로 JPA는 저걸 다 해준다고한다. JPA는 대체 뭐길래 모든 것을 다 해주는걸까?
그리고 몇 가지 오류를 수정했다.
- ID 값으로는 String이 올 수 없어서 ID를 자동으로 배정해주는 GeneratedValue 어노테이션을 사용했다.
- 그렇기 때문에 DB에 값을 저장할 때 ID를 넘겨줄 필요가 없어서 삭제
- Member 객체는 refreshToken으로 리프레시토큰을 저장하지만 DB에선 REFRESH_TOKEN으로 접근해야한다.

성공
NAME에는 사용자가 직접 설정한 닉네임이 들어갈 예정이다. 지금은 REFRESH_TOKEN의 값이 다른 것으로 구별하면 됨
영상으로 보기
우선은 여기까지.. 발표용 PPT 만들어야해서.....
다음에할거는...
다른 기능들에 대하여 DB를 저장하는 것이다.
사실 로그인은 닉네임만을 가지고 DB에서 정보를 긁어오는거라.. 정작 필요한 것은 회원가입에서 필요하다는거
'팀 프로젝트 > [2025][GDG]홍대 맛집 아카이빙 프로젝트' 카테고리의 다른 글
| [GDG] 개발코스 4주차 WIL (5) | 2025.07.29 |
|---|---|
| [GDG]홍대 맛집 아카이빙 프로젝트 #10.1 - H2 DB 강화하기 (2) | 2025.07.27 |
| [GDG]홍대 맛집 아카이빙 프로젝트 백엔드 개발 #9 - 회원가입 기능 개발하기 (1) | 2025.07.22 |
| [GDG]홍대 맛집 아카이빙 프로젝트 백엔드 개발 #8 - 투표기능 개발하기 (4) | 2025.07.21 |
| [GDG]홍대 맛집 아카이빙 프로젝트 #7 - 투표기능 기획 (2) | 2025.07.20 |