스프링부트와 AWS로 혼자 구현하는 웹서비스-JPA를 사용하는 이유

qq·2023년 9월 11일
0
post-thumbnail

게시판

  • 게시글 조회
  • 게시글 등록
  • 게시글 수정
  • 게시글 삭제

회원

  • 구글/ 네이버 로그인
  • 로그인한 사용자 글 작성 권한
  • 본인 작성 글에 대한 권한 관리

프로젝트 시작

domain패키지는 도메인을 담을 패키지

@NoArgsConstructor
@Getter
@Entity
public class Posts {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(length = 500,nullable = false)
    private String title;

    @Column(columnDefinition = "TEXT", nullable = false)
    private String content;

    private String author;

    @Builder
    public Posts(String title, String content, String author){
        this.title=title;
        this.content=content;
        this.author =author;
    }
}

@Entity

  • 테이블과 링크될 클래스임을 나타낸다
  • 기본값으로 클래스의 카멜케이스 이름을 언더스코어 네이밍으로 테이블 이름을 매칭한다

@GeneratedValue

  • PK의 생성 규칙을 나타낸다

@Column

  • 테이블의 칼럼을 나타내며 굳이 선언하지 않더라도 해당 클래스의 필드는 모두 칼럼이 된다
  • 사용하는 이유는, 기본값 외에 추가로 변경이 팔요한 옵션이 있으며 사용한다
  • 문자열의 경우 VARCHAR 기본값이 255인데 500으로 늘리고 싶거나 타입을 TEXT로 변경하고 싶거나(ex.content)등의 경우에 사용된다

@NoArgsConstructor

  • 기본 생성자 자동 추가
  • public Posts(){}와 같은 효과

@Builder

  • 해당 클래스의 빌더 패턴 클래스를 생성
  • 생성자 상단에 선언 시 생성자에 포함된 필드

💡Entity클래스에선는 절대 Setter메소드를 만들지 않는다

Builder를 쓰면 장점이 있다
예를 들어 다음과 같은 생성자가 있다면 new Example(b,a)처럼 a와 b의 위치를 변경해서 코드를 실행하기 전까지는 문제를 찾을 수 없다.

public Example(String a, String b){
	this.a = a;
    this.b = b;
}

하지만 Builder 어느 필드에 어떤 값을 채워야 할지 명확하게 인지할 수 있다.

Example.builder()
	.a(a)
    .b(b)
    .build();

Jpa Repository

import org.springframework.data.jpa.repository.JpaRepository;

public interface PostsRepository extends JpaRepository<Posts,Long> {
    
}

JpaRepository<Entity,PK타입>를 상속하면 기본적인 CRUD메소드

  • @Repository를 추가할 필요도 없습니다
  • Entity클래스와 기본 Entity Repository는 함께 위치해야 한다

Test


@ExtendWith(SpringExtension.class)
@SpringBootTest
class PostsRepositoryTest {
    @Autowired
    PostsRepository postsRepository;

    @After
    public void cleanup(){
        postsRepository.deleteAll();
    }

    @Test
    public void 게시물저장_불러오기(){
        //given
        String title = "테스트 게시물";
        String content = "테스트 본문";

        postsRepository.save(Posts.builder()
                        .title(title)
                        .content(content)
                        .author("bee1162@naver.com")
                .build());

        //when
        List<Posts> postsList = postsRepository.findAll();

        //then
        Posts posts = postsList.get(0);
        org.assertj.core.api.Assertions.assertThat(posts.getTitle()).isEqualTo(title);
        org.assertj.core.api.Assertions.assertThat(posts.getContent()).isEqualTo(content);
    }
    
    
}

spring.jpa.show_sql=true

application.properties에 추가하면 이런식으로 로그에 찍힌다

h2에서 MySQL로 바꾸면

spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect

profile
백엔드 개발자

0개의 댓글