# JpaRepository
React + Spring Boot + MySQL (5)
https://velog.io/@hyeonjoonpark/React-Spring-Boot-MySQL-4 이어서 Repository를 만들어보자 Repository com.example 폴더 안에 Repository 폴더를 만든다 Reposiroty 패키지 안에 다음과 같은 인터페이스를 만든다 UserRepository BoardRepository PopularSearchRepository LikeRepository CommentRepository 관련 어노테이션 : Repository로 사용하겠다 선언 (의존성 주입) @Component 어노테이션이 포함되어 있음 UserRepository는 JpaRepository를 상속받는

스프링 데이터JPA
스프링 데이터 JPA 리포지토리 공통 인터페이스 분석 공통 인터페이스 설정 > 스프링부트 사용시 @SpringBootApplication 위치를 지정(해당 패키지와 하위 패키지 인식) 만약 위치가 달라지면 @EnableJpaRepositories 필요 @Repository 애노테이션 생략가능 스프링 데이터 JPA 기반 리포지토리 > JpaRepository 인터페이스 : 공통CRUD 제공 제네릭틴 설정 제네릭 타입 T: 엔티티 ID: 엔티티의 식별자 타입 S: 엔티티와 그 자식 타입 주요메서드 save(S) : 새로운 엔티티는 저장하고 이미 있는 엔티티는 병합 delete(T) : 엔티티 하나를 삭제한다. 내부에서 EntityManager.remove() 호출 findById(ID) : 엔티티 하나를 조회한다. 내부에서 EntityManager.find() 호출 get
JPARepository - 메소드 커스텀하기
JPARepository는 기본 메소드 findById(), findAll ... 뿐만 아니라 커스텀을 통해 Repository를 이용할 수 있다. List findAllByPostId(Long post_id); 해당 구문을 보면 해석해 보면 findAll (comment) 전부 찾아볼건데 postId로 찾는다는 거다. 이렇게만 작성해주면 JPA가 알아서 SQL문을 생성해준다. 커스텀을 생성하기 위한 몇가지 생성 규칙 >팁) 컬럼명이나 해당 개체의 필드명들은 파스칼로 적어주는 것이 좋다 Method |method| 기능| |-|-| |save() | 레코드 저장 (insert, update)| |findOne() | primary key로 레코드 한건 찾기| | findAll() |전체 레코드 불러오기. 정렬(sort), 페이징(pageable) 가능| | count() | 레코드 갯수| |delete() | 레코
Spring Boot JPA 적용 2. JpaRepository 사용 심화
안녕하세요 이번 시간에는 JpaRepository 사용법에 대해 조금 더 깊게 알아보는 시간을 갖도록 하겠습니다. 먼저 Jpa 사용 시 FK 설정된 테이블 엔티티를 생성하는 방법에 대해 알아보겠습니다. 아래는 유저 정보와 공지사항 정보를 가지고 있는 UserAnnouncement 테이블의 Entity입니다. 테이블 내의 userID는 User 테이블의 ID와 매핑되며, announcementID는 Announcement 테이블의 ID와 매핑됩니다. FK 설정을 진행함에 있어서 컬럼의 관계를 정의하는 어노테이션은 @ManyToOne, @OneToMany 등의 어노테이션입니다. 해당 어노테이션은 일대다 혹은 다대일 관계를 정의하며 targetEntity에 정의한 엔티티와의 관계를 나타냅니다. 한 유저가 여러 공지사항을 읽을 수 있으며 한 공지사항을 여러 유저가 읽을 수 있기 때문에 UserAnnouncement 테이블 입장에서는 유저와 공지사항 테이블과 다대일 관계가 성립됩니
JpaRepository 인터페이스는 뭘까? 그리고 Optional<T>는 어디에 사용되지?
JpaRepository = Repository 인터페이스 iBatis나 MyBatis 등에서 Dao라고 불리는 DB Layer 접근자로, JPA에서는 Repository라고 부르며 인터페이스로 생성한다 인터페이스 생성 후, JpaRepository을 상속하면 기본적인 CRUD 메소드가 자동으로 생성된다. JpaRepository 설명 JpaRepository는 PagingAndSortingRepository, QueryByExampleExecutor 인터페이스를 상속받고 있음 PagingAndSqortingRepository는 CrudRepository 인터페이스를 상속받고 있음 기본적으로 제공하는 메소드 CrudRepository 인터페이스에는 기본적인 CRUD 메소드 제공 → `save(), findById(), existsById(), count(), deleteById(), delete
Spring Boot JPA 적용 1. JpaRepository 사용
안녕하세요 이번 시간에는 현재 서비스에 JPA를 적용하기 위한 기본 설정 작업을 진행하는 부분에 대해서 포스팅해보도록 하겠습니다. 우선 JPA란 Java Persistence API의 약자로 자바를 사용하여 데이터베이스와 상호작용하는데 사용되는 ORM(Object-Relational Mapping) 기술입니다. ORM이란 객체 지향 프로그래밍 언어와 관계형 데이터베이스 간의 데이터 변환 및 매핑을 처리해주는 기술로 개발자가 별도로 쿼리를 작성하지 않고도 DB와 상호작용이 가능하도록 해줍니다. 따라서 JPA를 도입하게 되면 DB와 관련된 복잡한 작업을 최소화하고, 객체 지향적인 코드를 작성하여 유지 보수성을 향상시킬 수 있습니다. 또한 실제 DB 구성이 바뀌어도 매핑된 엔티티를 기준으로 진행하기 때문에 독립적으로 사용할 수 있다는 장점 역시 존재합니다. 하지만 학습 곡선이 가파르며 매핑 작업을 잘못 수행할 경우 성능이 저하될 수 있는 이슈가 존재합니다. 저는 현재 서비스에 사용되는

[Spring Boot] 개념 정리
개념 정리 DTO는 객체, 즉 데이터다. (데이터를 DB에 전송해야 함.) getter, setter로 가져오고 보냄 JPA는 저장소를 쉽게 구현하도록 하는 것. (JAVA언어를 DB가 이해하도록 도와줌.) Entity : class Repository : interface, 일꾼 lombok은 코드를 간결화 함 (refactoring) Getter, setter를 작성하지 않아도 Annotation으로 깔끔하게 정리됨. model사용하기 (View로 전달하기 위함) 사용법 -> Parameter에 model을 넣어줘야 함. > Model을 data에서 가져오는 방법 1) id로 data를 가져옴 -> Repository를 통

Sekkison SpringBoot project - 09
Sekkison Project CORS >이때까지 모든 프로젝트는 하나의 프로젝트 안에 백엔드와 프론트엔드를 같이 넣어서 테스트를 진행했었다. 하지만 이번 프로젝트의 취지는 실제 백엔드와 프론트엔드의 협업이 어떤 방식으로 이루어지는지, 백엔드에서 API를 만들어 Response 하였을 떄, 프론트에서 요청을 어떻게 받는지를 알아내기 위한 작업을 목표로 하였다. >SpringBoot로 API를 만든 후, Visual Studio Code에 프론트 페이지를 구축하였다. >**어쨰선지 API 요청을 받아들

Sekkison SpringBoot project - 08
Sekkison Project BCryptPasswordEncoder >Sekkison 유저의 비밀번호를 안전하게 저장하기위해 BCryptPasswordEncoder를 사용해서 암호화를 진행하기로 하였다. >>BCryptPasswordEncoder는 Spring Seurity에서 제공하는 클래스 중 하나로 비밀번호를 암호화하는 데 사용할 수 있는 메서드를 가진 클래스이다. >먼저 Spring Security를 dependencies에 추가한다. >SecurityConfig 클래스에 BCryptPasswordEncoder을 bean으로 등록한다. >UserService에 회원가입 로직에 추가해 넣어주면 간단하게 사용할 수 있다. >**MySQL에

Sekkison SpringBoot project - 07
Sekkison Project 파일업로드 >> 유저의 프로필사진을 저장하기 위한 폴더를 Sekkison 폴더 바로 밑에 만들어 주었다. >> multipart file의 용량을 지정하고 업로드되는 경로를 지정해주었다. 유저 프로필을 저장하기 위한 폴더를 upload로 만들었으니 폴더명을 넣어주면 된다. UserFileController > Controller에서 업로드는 userId를 기준으로 사진을 MultipartFile file에 담아 매개변수로 받았다. UserFileService > MultipartFile을 사용하여 파일 업로드를 처리하고, 해당 파일을 로컬 파일 시스템에 저장하는 기능을 구현하였다. >>**
Sekkison SpringBoot project - 06
Sekkison Project Appoint >이제 우리 새끼손 프로젝트에서 가장 중요한 약속을 만들어보도록 하겠다. >약속을 만드는 과정에서 가장 중요하게 생각하는 것은 방장이 방을 만들고 사람들이 참여하며, 정보표시, 인원조정, 강퇴, 수정을 중점으로 로직을 작성해보았다. 약속만들기 AppointController >user_id를 기준으로 방을 만들며, 사람들과의 약속인지 나 혼자만의 약속여부인지, 날짜와 시간을 매개변수로 받는다. AppointService >기본적인 유효성 검사부터 시작하여 type과 방장여부를 통해 myAppoint에 내 약속을 저장하면서 생성해주었다. >여기서 type이란 약속의 종류를 분류하는데 쓰이는데, common 패키지에 enum으로 만들어 주었다. java에서의 enum은 형변환이 되지 않기 때문에 따로 지정해주었다. >>**FTF(0) : Fac
Sekkison SpringBoot project - 05
Sekkison Project ResponseForm class >API 응답을 반환을 위해 ResponseForm 객체를 사용하여 결과 알 수 있는 클래스를 만들어 주었다. >>**ResponseForm 클래스는 세 개의 필드를 가지고 있다. msg는 응답 메시지를 나타낸다. success는 요청의 성공 여부를 나타내는 boolean 값으로 설정해주었다. data는 API가 반환하는 데이터를 저장하는 데 사용하기 위해 만들어 주었다. setError 및 setSuccess 메서드는 각각 에러와 성공 응답을 설정하기 위해 사용된다. setError 메서드는 msg 필드를 설정하고 success를 false로 설정한다. setSuccess 메서드는 data 필드를 설정하고 success를 true로 설정한다. 따라서 API 응답을 반환할 때 ResponseForm 객체를 통해 실행성공여부를 알 수 있게 설정해보았다.** example UserCont
Sekkison SpringBoot project - 04
Sekkison Project Sekkison URL 설정 >## 🔽 RestAPI EndPoint >>| METHOD | URI | 기능 | | ------ | ---------------------------------- |--------------------------- | | POST | /users | 회원가입 | | POST | /users/login | 로그인 | | GET | /users/{userId} | User객체 반환 | | PUT | /users/{userId}

애완견 등록하기(1) - Entity 및 Repository 생성(+복합키 처리방법)
현재 설계한 앱의 방향은 회원가입 및 로그인을 진행한 후, 등록된 애완견이 없다면 애완견 등록 페이지로 자동으로 넘어가도록 하고 있습니다. 따라서 이번 글에서는 애완견 등록 기능을 만들어보도록 하겠습니다. 애완견 설계 ERD 애완견에 필요한 Entity를 ERD로 그려보았습니다. 애완견은 별도의 ID를 가진 엔티티인데, 애완견과 회원을 M:N관계로 매핑한 후, 둘을 기본키로 가지는 별도의 테이블을 생성하여 연관관계를 설정하려고 합니다. 이렇게 하는 이유는, 애완견을 임시로 맡기거나 할 때, 데이터를 바로 전달할 수 있도록 처리하기 위해서입니다. 추가적으로 견종은 별도로 DB에 저장하고, 클라이언트가 선택한 애완견의 견종 ID를 DTO로 담을 예정이기 때문에 별도의 엔티티로 생성

Sekkison SpringBoot project - 03 # 프로젝트 생성
Sekkison Project Project Setting > >프로젝트를 생성해준다. > >bulid.gradle 안에 사용할 라이브러리를 추가해준다. > >application.properties 안에 SQL을 사용하기 위한 기본설정을 해준다.. MySQL > >cmd을 열고 MySQL에 접속한다. 위 코드를 넣어주면 mySQL에 DB가 생성된다. >
Sekkison SpringBoot project - 02 # DB
Sekkison Project DB > >draw.io를 통해 테이블을 구성해주었다. MySQL > >cmd을 열고 MySQL에 접속한다. 위 코드를 넣어주면 mySQL에 DB가 생성된다. >
Sekkison SpringBoot project - 01 # 기획
Sekkison Project 기획 >### 배경 >> 몇 가지 프로젝트를 진행하며, 그동안 배운 기술을 정리하여 새로운 팀프로젝트를 진행하고 싶었다. 기본적인 CRUD만 구현하던 단계에서 한발자국 더 나아가기 위해 팀인원 두명으로 진행하려고 마음먹게 되었다. >### 아이디어 >>인생을 살아오면서 가장 중요하게 생각하는 것이 "약속"이다. 자신이나 인간관계에서 사람을 긍정적으로 판단하는데 있어 가장 중요한 요소라고 생각한다. 따라서 나만의 약속과 타인과의 약속을 지킬수 있는 웹어플리케이션을 만들고자 마음을 먹었다. 같은 관심사를 가진 사람들과 약속을 만들며, 위치기반으로 실시간 위치를 파악할 수 있고 더 나아가 캘린더를 통해 자신의 약속을 관리할 수 있도록 구현을 해보려고 한다. >>원래는 실시간 위치로 유저를 표현하고 싶었지만, 사생활침해 우려가 있기 때문에 실시간 거리로 변경하게 되었다 >### 컨셉 
JpaRepository
1. 아래처럼 도메인 객체를 생성하고 2. Repository 생성하면 (extends JpaRepository) 방금 만들어준 메소드 이름만으로도 알아서 쿼리문을 짜준다 추가예정

로그인 / 회원가입 구현(1) - Mapper 적용 및 Domain, Repository구현
시작하기 전, Lombok 어노테이션의 정상 동작을 위해 Settings -> Annotation Processors에서 Enable annotation processing을 활성화 해주시기 바랍니다. EnableJpaAuditing 회원 Entity는 이후에 Update가 될 가능성이 있습니다. 하지만 ID값이 자동생성된 값이 아니라면, JPA는 이를 구분할 수 없습니다. 회원 엔티티의 아이디는 사용자가 입력한 UserId이므로 CreatedDate라는 별도의 애트리뷰트를 통해 신규 엔티티인지 판별한 후, 이후 JPA에서 save() 메서드를 호출할 때 Update를 할지 Insert를 할지 알려주어야 합니다. >참고자료 https://ttl

JpaRepository 2
MemoReposiory >JpaRepository를 사용할 때는 엔티티의 타입 정보(Memo 클래스 타입)와 @Id의 타입을 지정하게 됩니다. 이처럼 Spring Data jPA는 인터페이스 선언만으로도 자동으로 스프링(bean)으로 등록됩니다 테스트코드를통한 CRUD 연습 • insert 작업: save(엔티티 객체) • select 작업 : findByld(키 타입), getOne(키 타입) • update 작업: save(엔티티 객체) • delete 작업: deleteByld(키 타입), delete(엔티티 객체) MemoRepositoryTests 스프링이 내 부적으로 해당 클래스를 자동으로 생성(AOP기능) coin.sun.proxy.$ProxyXX와 같이 작성한 적이 없는 클래 스의 이름이 출력되는 것을 확인할 수 있습니다(동적 프록시라는 방식으로 만들어집 니다). -TestInsertDummies()의 내용은 K)0개의