diff --git a/.gitignore b/.gitignore index 63177e3..cf4dc8c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +generated + HELP.md .gradle /build/ diff --git a/build.gradle b/build.gradle index 3f2652e..07a0afc 100644 --- a/build.gradle +++ b/build.gradle @@ -3,6 +3,8 @@ plugins { id 'java' } +apply plugin: 'java' +apply plugin: 'org.springframework.boot' apply plugin: 'io.spring.dependency-management' group = 'org.dailystudio' @@ -20,8 +22,16 @@ repositories { } dependencies { + runtimeOnly('com.h2database:h2') + compile("org.springframework.boot:spring-boot-devtools") + + runtimeOnly 'mysql:mysql-connector-java' + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + + implementation('io.springfox:springfox-swagger2:+') + implementation('io.springfox:springfox-swagger-ui:+') + + compile "org.projectlombok:lombok:+" implementation 'org.springframework.boot:spring-boot-starter-web' - compileOnly 'org.projectlombok:lombok' - annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' } diff --git a/src/main/java/org/dailystudio/springbootstudy/SpringbootstudyApplication.java b/src/main/java/org/dailystudio/springbootstudy/SpringbootstudyApplication.java index 574a96e..44a039e 100644 --- a/src/main/java/org/dailystudio/springbootstudy/SpringbootstudyApplication.java +++ b/src/main/java/org/dailystudio/springbootstudy/SpringbootstudyApplication.java @@ -6,8 +6,8 @@ @SpringBootApplication public class SpringbootstudyApplication { - public static void main(String[] args) { - SpringApplication.run(SpringbootstudyApplication.class, args); - } + public static void main(String[] args) { + SpringApplication.run(SpringbootstudyApplication.class, args); + } } diff --git a/src/main/java/org/dailystudio/springbootstudy/config/SwaggerConfig.java b/src/main/java/org/dailystudio/springbootstudy/config/SwaggerConfig.java new file mode 100644 index 0000000..aae4943 --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/config/SwaggerConfig.java @@ -0,0 +1,24 @@ +package org.dailystudio.springbootstudy.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +@Configuration +@EnableSwagger2 +public class SwaggerConfig { + + @Bean + public Docket api() { + return new Docket(DocumentationType.SWAGGER_2) + .select() + .apis(RequestHandlerSelectors.any()) // 현재 RequestMapping으로 할당된 모든 URL 리스트를 추출 + .paths(PathSelectors.ant("/api/**")) // 그중 /api/** 인 URL들만 필터링 + .build(); + } + +} \ No newline at end of file diff --git a/src/main/java/org/dailystudio/springbootstudy/controller/FamilyController.java b/src/main/java/org/dailystudio/springbootstudy/controller/FamilyController.java new file mode 100644 index 0000000..79ce321 --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/controller/FamilyController.java @@ -0,0 +1,38 @@ +package org.dailystudio.springbootstudy.controller; + +import lombok.RequiredArgsConstructor; +import org.dailystudio.springbootstudy.domain.Parent; +import org.dailystudio.springbootstudy.dto.parent.ParentDto; +import org.dailystudio.springbootstudy.service.FamilyService; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("api/family") +@RequiredArgsConstructor +public class FamilyController { + + private final FamilyService familyService; + + @PostMapping("/save/parent") + public ResponseEntity saveParent(){ + familyService.saveParent(); + return ResponseEntity.ok().build(); + } + + @PostMapping("/save/children") + public ResponseEntity saveChildren(){ + familyService.saveChild(); + return ResponseEntity.ok().build(); + } + + @GetMapping("/parent") + public ResponseEntity getParent(){ + Parent parent = familyService.getParent(); + ParentDto parentDto = new ParentDto(parent); + return ResponseEntity.ok(parentDto); + } +} diff --git a/src/main/java/org/dailystudio/springbootstudy/controller/UserController.java b/src/main/java/org/dailystudio/springbootstudy/controller/UserController.java new file mode 100644 index 0000000..9bbfe05 --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/controller/UserController.java @@ -0,0 +1,57 @@ +package org.dailystudio.springbootstudy.controller; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dailystudio.springbootstudy.domain.User; +import org.dailystudio.springbootstudy.repository.UserRepository; +import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("api/user") +@RequiredArgsConstructor +@Slf4j +public class UserController { + + private final UserRepository userRepository; + + + @PostMapping + @Transactional + public ResponseEntity testUser() { + + //저장할 User를 만든다. + User user = new User(); + user.setName("이름"); + user.setEmail("example@gmail.com"); + user.setPass("1234"); + user.setPhone("010-0100-0101"); + + //user를 저장한다. (영속상태로 만들고 flush한다.) + userRepository.save(user); + + //모든 user 정보를 가져온다. + List users = userRepository.findAll(); + + //그중 하나의 user정보를 확인해본다. + User someOne = users.get(0); + log.info("SomeOne email - " + someOne.getEmail()); + log.info("SomeOne name - " + someOne.getName()); + log.info("SomeOne pass - " + someOne.getPass()); + log.info("SomeOne phone - " + someOne.getPhone()); + + //정보를 바꿔보자. + someOne.setName("바뀐이름"); + log.info("SomeOne name - " +someOne.getName()); + + //정보를 지워보자. + userRepository.delete(someOne); + + return ResponseEntity.ok().build(); + } +} diff --git a/src/main/java/org/dailystudio/springbootstudy/domain/Child.java b/src/main/java/org/dailystudio/springbootstudy/domain/Child.java new file mode 100644 index 0000000..8ff70f8 --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/domain/Child.java @@ -0,0 +1,29 @@ +package org.dailystudio.springbootstudy.domain; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.RequiredArgsConstructor; +import lombok.Setter; + +import javax.persistence.*; +import javax.validation.constraints.NotNull; + +@Entity +@Table(name = "child") +@Getter +@Setter +public class Child { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "child_id") + private Long id; + + @NotNull + private String name; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "parent_id") + private Parent parent; + +} diff --git a/src/main/java/org/dailystudio/springbootstudy/domain/Parent.java b/src/main/java/org/dailystudio/springbootstudy/domain/Parent.java new file mode 100644 index 0000000..6032186 --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/domain/Parent.java @@ -0,0 +1,28 @@ +package org.dailystudio.springbootstudy.domain; + +import lombok.Getter; +import lombok.Setter; + +import javax.persistence.*; +import javax.validation.constraints.NotNull; +import java.util.ArrayList; +import java.util.List; + +@Entity +@Table(name = "parent") +@Getter +@Setter +public class Parent { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "parent_id") + private Long id; + + @NotNull + private String name; + + @OneToMany(cascade = CascadeType.ALL, mappedBy = "parent") + private List children = new ArrayList<>(); + +} diff --git a/src/main/java/org/dailystudio/springbootstudy/domain/User.java b/src/main/java/org/dailystudio/springbootstudy/domain/User.java new file mode 100644 index 0000000..f941b8e --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/domain/User.java @@ -0,0 +1,36 @@ +package org.dailystudio.springbootstudy.domain; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.RequiredArgsConstructor; +import lombok.Setter; + +import javax.persistence.*; +import javax.validation.constraints.NotNull; + + +@Entity +@Table(name = "user") +@NoArgsConstructor +@Getter +@Setter +public class User { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "user_id") + private Long id; + + @NotNull + private String email; + + @NotNull + private String name; + + @NotNull + private String pass; + + @NotNull + private String phone; + +} diff --git a/src/main/java/org/dailystudio/springbootstudy/dto/child/ChildResDto.java b/src/main/java/org/dailystudio/springbootstudy/dto/child/ChildResDto.java new file mode 100644 index 0000000..9ccbde3 --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/dto/child/ChildResDto.java @@ -0,0 +1,13 @@ +package org.dailystudio.springbootstudy.dto.child; + +import lombok.Getter; +import org.dailystudio.springbootstudy.domain.Child; + +@Getter +public class ChildResDto { + private String name; + + public ChildResDto(Child child) { + this.name = child.getName(); + } +} diff --git a/src/main/java/org/dailystudio/springbootstudy/dto/parent/ParentDto.java b/src/main/java/org/dailystudio/springbootstudy/dto/parent/ParentDto.java new file mode 100644 index 0000000..1e8e020 --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/dto/parent/ParentDto.java @@ -0,0 +1,24 @@ +package org.dailystudio.springbootstudy.dto.parent; + +import lombok.Getter; +import org.dailystudio.springbootstudy.domain.Parent; +import org.dailystudio.springbootstudy.dto.child.ChildResDto; + +import java.util.List; +import java.util.stream.Collectors; + +@Getter +public class ParentDto { + private Long id; + private String name; + + private List children; + + public ParentDto(Parent parent) { + this.id = parent.getId(); + this.name = parent.getName(); + this.children = parent.getChildren().stream() + .map(child -> new ChildResDto(child)) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/org/dailystudio/springbootstudy/repository/ChildRepository.java b/src/main/java/org/dailystudio/springbootstudy/repository/ChildRepository.java new file mode 100644 index 0000000..06d24ee --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/repository/ChildRepository.java @@ -0,0 +1,7 @@ +package org.dailystudio.springbootstudy.repository; + +import org.dailystudio.springbootstudy.domain.Child; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ChildRepository extends JpaRepository { +} diff --git a/src/main/java/org/dailystudio/springbootstudy/repository/ParentRepository.java b/src/main/java/org/dailystudio/springbootstudy/repository/ParentRepository.java new file mode 100644 index 0000000..92930a7 --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/repository/ParentRepository.java @@ -0,0 +1,7 @@ +package org.dailystudio.springbootstudy.repository; + +import org.dailystudio.springbootstudy.domain.Parent; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ParentRepository extends JpaRepository { +} diff --git a/src/main/java/org/dailystudio/springbootstudy/repository/UserRepository.java b/src/main/java/org/dailystudio/springbootstudy/repository/UserRepository.java new file mode 100644 index 0000000..0ad9916 --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/repository/UserRepository.java @@ -0,0 +1,7 @@ +package org.dailystudio.springbootstudy.repository; + +import org.dailystudio.springbootstudy.domain.User; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface UserRepository extends JpaRepository { +} diff --git a/src/main/java/org/dailystudio/springbootstudy/service/FamilyService.java b/src/main/java/org/dailystudio/springbootstudy/service/FamilyService.java new file mode 100644 index 0000000..7708fb8 --- /dev/null +++ b/src/main/java/org/dailystudio/springbootstudy/service/FamilyService.java @@ -0,0 +1,51 @@ +package org.dailystudio.springbootstudy.service; + +import lombok.RequiredArgsConstructor; +import org.dailystudio.springbootstudy.domain.Child; +import org.dailystudio.springbootstudy.domain.Parent; +import org.dailystudio.springbootstudy.repository.ChildRepository; +import org.dailystudio.springbootstudy.repository.ParentRepository; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class FamilyService { + + private final ParentRepository parentRepository; + private final ChildRepository childRepository; + + public void saveParent(){ + Parent parent = new Parent(); + parent.setName("부모님"); + parentRepository.save(parent); + } + + public void saveChild(){ + Child child1 = new Child(); + Child child2 = new Child(); + + child1.setName("자식"); + child2.setName("자식"); + + Parent parent = parentRepository.findAll().get(0); + + child1.setParent(parent); + child2.setParent(parent); + + childRepository.save(child1); + childRepository.save(child2); + } + + public Parent getParent(){ + Parent parent = parentRepository.findAll().get(0); + System.out.println("parent id = "+parent.getId()); + System.out.println("parent name = "+parent.getName()); + + System.out.println("parent has "+parent.getChildren().size()+" children."); + return parent; + } + +} diff --git a/src/main/resources/application-local.properties b/src/main/resources/application-local.properties new file mode 100644 index 0000000..35168f0 --- /dev/null +++ b/src/main/resources/application-local.properties @@ -0,0 +1,5 @@ +spring.h2.console.path=/h2 +spring.datasource.url=jdbc:h2:~/ds;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE +spring.jpa.database-platform=org.hibernate.dialect.H2Dialect +spring.h2.console.enabled=true +spring.jpa.hibernate.ddl-auto=create \ No newline at end of file diff --git a/src/main/resources/application-prod.properties b/src/main/resources/application-prod.properties new file mode 100644 index 0000000..3d82c11 --- /dev/null +++ b/src/main/resources/application-prod.properties @@ -0,0 +1,18 @@ +## ͺ̽ ⺻ +spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver +spring.datasource.username=root +spring.datasource.password=saul2449 + + +## ͺ̽ Ű ּ +## jdbc:mysql://ּ/Ű̸? +spring.datasource.url=jdbc:mysql://localhost/ds?useSSL=false&serverTimezone=UTC + + +##MYSQL +spring.jpa.database=mysql +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL55Dialect + +## ͺ̽ ڵ +spring.jpa.hibernate.ddl-auto=update +spring.jpa.generate-ddl=true \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 8b13789..6d7ec57 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1 +1,12 @@ +## properties մϴ. +spring.profiles.active=prod + +## Ǵ SQL մϴ. +spring.jpa.show-sql=true +spring.jpa.properties.hibernate.format_sql=true + + +## α մϴ +logging.level.org.hibernate.type=trace +#logging.level.org.hibernate=info \ No newline at end of file diff --git a/src/test/java/org/dailystudio/springbootstudy/SpringbootstudyApplicationTests.java b/src/test/java/org/dailystudio/springbootstudy/SpringbootstudyApplicationTests.java index 1cbed09..71a1031 100644 --- a/src/test/java/org/dailystudio/springbootstudy/SpringbootstudyApplicationTests.java +++ b/src/test/java/org/dailystudio/springbootstudy/SpringbootstudyApplicationTests.java @@ -9,8 +9,8 @@ @SpringBootTest public class SpringbootstudyApplicationTests { - @Test - public void contextLoads() { - } + @Test + public void contextLoads() { + } }