본문 바로가기

전체 글

(146)
홍익 병원 예약 시스템 개발 후기 2주차까지 병원 예약 시스템을 완성하여 마무리 지었다. 전체적인 구조는 일반 사용자의 입장에서 구현한 웹사이트로써, 개인 회원이 병원에 예약을 하는 경우 환자의 예약 내역이 데이터베이스로 옮겨지는 구조로 사이트를 구현하였다. 2주차까지 구현한 내용은 단지 일반 사용자의 입장에서 구현한 사이트이었기에, 별도의 운영자 페이지의 필요성을 느끼게 되었다. 기존의 코드를 재활용하여 구현이 가능하다 판단해서 컨트롤러를 추가하는 것과 로그인한 아이디의 일반유저, 운영자 구분을 위한 로직 이외에는 별도로 백엔드 단을 구현하지는 않았다. public enum AccountType { // 일반회원, 운영자 구분 관리용 USER, ADMIN } public class User{ //... 생략 // 일반 유저와 운영자 구..
SpringBoot- @DeleteMapping @PostMapping과 @DeleteMapping의 차이점. 기본적으로 POST 메서드를 통해서 DELETE 메서드의 역할을 충분히 수행할 수 있다. 그렇다면 굳이 @DeleteMapping을 사용하는 이유는 뭘까? - 가독성 가장 근본적인 이유는 가독성에 있다. 어떠한 엔티티를 삭제하기 위한 컨트롤러 메서드를 생성했다면 어노테이션으로는 @PostMapping 또는 @DeleteMapping을 사용할 수 있을텐데 이때 DeleteMapping으로 설정하게 된다면, 코드를 보는 입장에서 이 메서드는 명확하게 DELETE 메서드를 수행하는 메서드이다란 것을 이해할 수 있게 된다. @DeleteMapping 사용법 @DeleteMapping을 사용하기 위해선 설정이 필요하다. form 태그의 method에 ..
DB- 테이블 외래키 제약조건 외래키 제약 조건 이번에 개인 프로젝트를 진행하면서 엔티티간 연관관계를 매핑하는데 있어서 단순히 객체로서의 매핑 관계 뿐만 아니라 DB에서 테이블로서의 연관관계에 대한 이해도 필요하단 점을 느껴서 따로 정리를 하게 되었다. 일단 외래키 제약조건의 정의는 다음과 같다. "외래키 제약조건은 한 마디로 말해서 두 테이블간의 관계를 선언하여 데이터간의 무결성을 보장해주는 역할"을 위한 제약이다. 여기서 중요한 점은 무결성이다. 이는 간단히 말해서 테이블간의 연관관계를 설정할 때 엉뚱한 값이 연결되지 않도록 한다는 것이다. 외래키 제약조건은 관계형 데이터베이스에서 데이터의 일관성과 무결성을 보장하기 위해 사용한다. 이러한 제약조건은 다음과 같은 목적으로 존재한다: 1. **데이터 무결성 유지:** 외래키 제약조건..
Querydsl- 벌크 연산 @Test // member.age가 28보다 적은 member.username을 "비회원"으로 update public void bulkUpdate() throws Exception{ // member1 = 10 -> 비회원 // member2 = 20 -> 비회원 // member3 = 30 -> 유지 // member4 = 40 -> 유지 long count = queryFactory .update(member) .set(member.username, "비회원") //조건을 만족하는 member의 username이 "비회원" .where(member.age.lt(28)) .execute(); // 안 해주면 영속성 컨텍스트에서 데이터 가져와서 업데이트된 DB의 값을 가져오지 못함 // em.flus..
Querydsl- 동적쿼리 BooleanBuilder querydsl에서는 BooleanBuilder 객체를 이용해서 동적 쿼리를 발생시킬 수 있다. 예를 들어 Member 엔티티를 조회하되, 해당 엔티티의 이름과 나이로 조회를 하는 메서드를 구현한다고 하자. @Test public void dynamicQuery_BooleanBuilder() throws Exception{ String usernameParam = "member1"; Integer ageParam = 10; // searchMember1: // 1) 인자가 모두 들어간 경우 두 조건을 모두 만족하는 엔티티 조회 // 2) 인자가 1개만 들어간 경우(나머지는 null인 경우) 들어간 조건으로만 엔티티 조회 // 3) 인자가 모두 null인 경우, 조건 없이 모두 ..
Querydsl- 프로젝션 프로젝션 프로젝션이란 select절로 조회할 대상을 지정하는 것을 의미한다. 예컨데 querydsl에서는 프로젝션 대상이 하나인 경우 단일 타입으로 반환을 하게된다. 프로젝션 대상이 하나인 경우 List result = queryFactory .select(member.username) .from(member) .fetch(); 반면에 프로젝션 대상이 여러개인 경우 튜플이나 DTO를 통해서 조회하게 된다. 프로젝션 대상이 여러개인 경우 List result = queryFactory .select(member.username, member.age) .from(member) .fetch(); for (Tuple tuple : result) { String username = tuple.get(member...
Querydsl- 조인 @Test public void join() throws Exception{ List result = queryFactory .selectFrom(member) .join(member.team, team) .where(team.name.eq("teamA")) .fetch(); for (Member m : result) { assertThat(m.getTeam().getName()).isEqualTo("teamA"); } } /** * 세타 조인 * 회원의 이름이 팀 이름과 같은 회원 조회 */ @Test public void theta_join() throws Exception{ // 세타조인 예제를 위한 엔티티 em.persist(new Member("teamA")); em.persist(new Mem..
Querydsl- 집합 @Test public void aggregation() { /* * JPQL * select * Count(m), * Sum(m.age), * Avg(m.age), * Max(m.age), * Min(m.age) * from Member m * */ // Tuple: 다양한 데이터 셋을 저장 가능 Tuple tuple = queryFactory .select( member.count(), member.age.sum(), member.age.avg(), member.age.max(), member.age.min() ) .from(member) .fetchOne(); // Tuple의 데이터를 get() 메서드를 이용해서 조회가능 assertThat(tuple.get(member.count())).isEq..