10/11: User Table을 Entity로 만들고 테스트해보기
원래 Mepe 프로젝트에서 jdbc로 직접 sql문으로 접근하는 코드를 사용했는데 다음과 같은 이유로 jpa로 변경해야겠다고 생각했다.
“방금 insert한 object의 index 불러오기” 를 하고 싶은 것이 엄청 큰 이유였다.
현재 sql last_insert_id()
을 사용하고 있기는 하지만 요청이 많아지면 옳지 않은 결과값이 나올 수 있기 때문에 불안하기 때문이다.
현재 insert나 update관련해서 겹치는 코드의 양이 너무 너무 많다.
jpa를 잘 다뤄보고 싶어서!
그래서 jpa로 변경하는 첫번째 날… 일단 user만 가볍게 바꿔보기로 했다. fk가 가장 많이 연결되어 있어서 제일 먼저 jpa로 바꾸는게 편할 것 같았다.
기존 프로젝트에서 또 병렬적으로 진행중인 업무가 있어서 일단 프로젝트를 새로 파서 entity와 repository, test 코드를 작성해보는 용으로 만들었다.
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=[AWS에 나와있는 url]
spring.datasource.username=admin
spring.datasource.password=[비밀번호]
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=none
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.physical_naming_strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
//mysql
implementation 'mysql:mysql-connector-java'
//JUnit4 추가
testImplementation("org.junit.vintage:junit-vintage-engine") {
exclude group: "org.hamcrest", module: "hamcrest-core"
}
@Entity
@Getter
@Setter
@DynamicInsert
@DynamicUpdate
public class user {
@Id
private String id;
@ColumnDefault("https://daotool.s3.ap-northeast-2.amazonaws.com/static/user/a4cc74a2-ee79-4098-b4d7-f0f9c3de6099bannerimg-default2.png")
private String backImage;
private String profileImg;
private String introduction;
private String url;
@ColumnDefault("0")
private Integer hits;
@ColumnDefault("0")
private Integer todayHits;
@ColumnDefault("10")
private Integer nftRefreshLeft;
@CreationTimestamp
private Timestamp createdAt;
@GeneratedValue
private Integer index;
private String nickname;
@ColumnDefault("0")
private Integer todayFollows;
@Column(updatable = false, nullable = false)
@CreationTimestamp
private Timestamp refreshAt;
}
@Repository
public class UserRepository {
@PersistenceContext
EntityManager em;
public String save(user user){
em.persist(user);
return user.getId();
}
public user find(String id){
return em.find(user.class, id);
}
}
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserRepositoryTest {
@Autowired
UserRepository userRepository;
@Test
@Transactional
@Rollback(false)
public void testMember(){
user user = new user();
user.setId("jpaTest");
user.setNickname("jpaTest");
String savedId = userRepository.save(user);
com.propwave.mepeWithJPA.domain.user findMember = userRepository.find(savedId);
Assertions.assertThat(findMember.getId()).isEqualTo(user.getId());
Assertions.assertThat(findMember).isEqualTo(user);
}
}
spring.jpa.properties.hibernate.physical_naming_strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
@DynamicInsert
@DynamicUpdat
이렇게 test가 통과될 수 있도록 하는 것을 목표로 하서 오류를 계속 수정하는 형식으로 코딩을 하니까 굉장히 재밌고 뿌듯했다.