일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 막내의막무가내 일상
- 부스트코스
- flutter network call
- 막내의막무가내 코틀린
- 프래그먼트
- 막내의막무가내 rxjava
- 주택가 잠실새내
- 막내의막무가내 프로그래밍
- 막내의막무가내 알고리즘
- 막내의 막무가내
- 막내의막무가내
- 막내의 막무가내 알고리즘
- 막내의막무가내 SQL
- 막내의막무가내 플러터 flutter
- 부스트코스에이스
- 안드로이드 sunflower
- 막내의막무가내 안드로이드 에러 해결
- 막내의막무가내 코틀린 안드로이드
- Fragment
- 주엽역 생활맥주
- 막내의막무가내 코볼 COBOL
- 안드로이드 Sunflower 스터디
- 프로그래머스 알고리즘
- 2022년 6월 일상
- 안드로이드
- 막내의막무가내 플러터
- 막무가내
- 막내의막무가내 안드로이드
- 막내의막무가내 안드로이드 코틀린
- 막내의막무가내 목표 및 회고
- Today
- Total
막내의 막무가내 프로그래밍 & 일상
[Spring Boot] JPA 추가 및 프로젝트 패키지 분리 본문
조금씩 시간날 때 지인과 스프링 부트 토이프로젝트를 진행 중에 있습니다.
막학년이라 할게 넘 많네요. (안드로이드, 알고리즘, 토스, 토익, 졸프, 학교수업 등 ....) 그래서 일단 늦더라도 완성하는거를 목표로 하고 있습니다.
오늘은 jpa 하고 패키지 분리한 것을 간단하게 기록할려합니다. ( 개발환경 세팅 )
먼저
jpa porm.xml에 추가 후
Failed to read artifact descriptor for org.springframework.boot:spring-boot-starter-data-jpa:jar:2.2.5.RELEASE less... (Ctrl+F1)
Inspection info: Inspects a Maven model for resolution problems
에러가 발생하였는데 구글링해도 별 답이 안나오고 하나 나온답이 C드라이브 user폴더 m2 의 repository 삭제하고 다시 키라했는데 했다가 프로젝트 터졌습니다.
그래서 다시 클론하고 jpa 관련 porm.xml 에 디펜던시 추가하니 이번엔 잘되더라고요.
JPA 를 사용해보면서 느낀점은 안드로이드하고 비교하면 ROOM 데이터베이스하고 좀 비슷한것 같습니다. ORM 을 지원해주며 JpaRepository <Entity>를 제네릭으로 상속받으면서 여러 SQL문도 자동으로 생성해주고 매우 편리한 것 같습니다.
다음과 같이 말이죠 find~ , save는 따로 레포지토리에서 만들지 않아도 있고요. save 같은 경우 알아서 ORM 으로 맵핑해서 저장해줍니다.
JpaRepository에서 지원하지 않는 SQL 문은 @Query를 통해 직접 적어주면 되고요.
public interface UserRepository extends JpaRepository<UserEntity, Long> {
List<UserEntity> findUserEntityByEmail(String email);
List<UserEntity> findUserEntityByName(String name);
}
@Transactional
public Long saveUser(UserDto userDto) {
return userRepository.save(userDto.toEntity()).getId();
}
https://arahansa.github.io/docs_spring/jpa.html
위 사이트에서 JPA 의 기능을더 자세히 알 수 있습니다.
일단 세팅내용은 다음과 같이했습니다. (일단은..)
[porm.xml 은 다음과 같습니다.]
springboot 관련 디펜던시(thymeleaf, web 등), lombok, 부스스트랩, mysql 등을 추가했습니다.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.mtjin</groupId>
<artifactId>itarticle</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>itarticle</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--h2-->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
<!-- BootStrap -->
<dependency>
<groupId>org.webjars</groupId>
<artifactId>bootstrap</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>org.webjars</groupId>
<artifactId>jquery</artifactId>
<version>3.3.1</version>
</dependency>
<!-- DB(mysql) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
[디렉토리 구조는 다음과 같습니다. ]
[Controller]
package com.mtjin.itarticle.controller;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
@Controller
@AllArgsConstructor
public class LoginController {
@RequestMapping(value = "/login", method = RequestMethod.GET)
public ModelAndView goLogin() {
ModelAndView mv = new ModelAndView();
mv.setViewName("views/login/login");
return mv;
}
@RequestMapping(value = "/register", method = RequestMethod.GET)
public ModelAndView goRegister() {
ModelAndView mv = new ModelAndView();
mv.setViewName("views/login/register");
return mv;
}
@RequestMapping(value = "/forgot", method = RequestMethod.GET)
public ModelAndView goForgot() {
ModelAndView mv = new ModelAndView();
mv.setViewName("views/login/forgot");
return mv;
}
@RequestMapping(value = "/reset", method = RequestMethod.GET)
public ModelAndView goReset() {
ModelAndView mv = new ModelAndView();
mv.setViewName("views/login/reset");
return mv;
}
}
[Entity]
package com.mtjin.itarticle.domain.entity;
import lombok.Getter;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.Column;
import javax.persistence.EntityListeners;
import javax.persistence.MappedSuperclass;
import java.time.LocalDateTime;
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class TimeEntity {
@CreatedDate
@Column(updatable = false)
private LocalDateTime createdDate;
@LastModifiedDate
private LocalDateTime modifiedDate;
}
package com.mtjin.itarticle.domain.entity;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import javax.persistence.*;
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@Entity
@Table(name = "user")
public class UserEntity extends TimeEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(length = 20, nullable = false)
private String email;
@Column(length = 20, nullable = false)
private String password;
@Builder
public UserEntity(Long id, String email, String password) {
this.id = id;
this.email = email;
this.password = password;
}
}
[Repository]
package com.mtjin.itarticle.domain.repository;
import com.mtjin.itarticle.domain.entity.UserEntity;
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<UserEntity, Long> {
}
[Service]
package com.mtjin.itarticle.service;
import com.mtjin.itarticle.UserDto;
import com.mtjin.itarticle.domain.repository.UserRepository;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@AllArgsConstructor
@Service
public class UserService {
private UserRepository userRepository;
@Transactional
public Long saveUser(UserDto userDto){
return userRepository.save(userDto.toEntity()).getId();
}
}
[UserDto]
package com.mtjin.itarticle;
import com.mtjin.itarticle.domain.entity.UserEntity;
import lombok.*;
import java.time.LocalDateTime;
@Getter
@Setter
@ToString
@NoArgsConstructor
public class UserDto {
private long id;
private String email;
private String password;
public UserEntity toEntity() {
UserEntity boardEntity = UserEntity.builder()
.id(id)
.email(email)
.password(password)
.build();
return boardEntity;
}
@Builder
public UserDto(long id, String email, String password, LocalDateTime createdDate, LocalDateTime modifiedDate) {
this.id = id;
this.email = email;
this.password = password;
}
}
스프링부트는 밑 블로그에서 많이 참고하고 있습니다. 설명이 자세하더라고요.
https://victorydntmd.tistory.com/326?category=764331
감사합니다. !!
'웹 > Spring Boot' 카테고리의 다른 글
[Spring Boot] $.ajax is not a function 에러 처리 (0) | 2020.04.16 |
---|---|
[Spring Boot] 스프링부트 타임리프 (thymeleaf) 정리 (0) | 2020.04.15 |
[Spring Boot] aws mysql 데이터베이스 연동 기록 (0) | 2020.04.07 |
[Spring] 인텔리제이 스프링부트 세팅 (0) | 2020.03.14 |
[Spring] 스프링부트 컨트롤러 (Springboot controller) (0) | 2020.02.14 |