반응형

1. 시험환경

    ˙ 윈도우

    ˙ Visual Studio Code

    ˙JDK 17

    ˙Spring Boot

 

2. 목적

    ˙ Visual Studio Code에서 Spring Boot 프로젝트를 생성하기 위한 플러그인(plugin)을 설치한다.

    ˙ Visual Studio Code에서 Spring Boot 프로젝트를 생성한다.

    ˙ Spring Boot에 테스트 코드를 입력하고 동작 여부를 확인한다.

 

3. 적용

    ① Visual Studio Code에서 Spring Boot 프로젝트를 지원하기 위한 플러그인들을 설치한다.

        - Extension Pack for Java
        - Spring Boot Extension Pack
        - Lombok Annotations Support for VS Code
        - Spring Initializr Java Support

 

    ② Command Palette에서 "Spring Initializer: [빌드 프로젝트]"를 선택한다.

        - 메뉴 : [View] → [Command Palette]

        - 단축키 : <Ctrl> + <Shift> + <P>

 

    ③ Spring Boot Framework 버전을 선택한다.

 

    ④ 개발 언어, 패키지, 프로젝트명, 빌드파일 형식(jar, war), 자바 버전을 설정한다.

 

    ⑤ 프로젝트에서 사용할 의존성 패캐지를 추가한다.

 

    ⑥ 프로젝트를 구성할 루트 디렉토리를 선택한다.

 

    ⑦ Controller 생성 및 테스트 코드를 작성하고, 프로젝트를 실행한다.

        - 프로젝트 실행 단축키 : <Ctrl> + <F5>

 

4. 결과

    ˙ 프로젝트 실행 여부를 확인한다.

 

    ˙ 프로젝트 파일 다운로드

template-springboot.zip
0.08MB

 

반응형
반응형

1. 시험환경

    ˙ JAVA 17

    ˙ 스프링프레임워크

 

2. 목적

    ˙ JAVA에서 of를 사용하는 이유에 대하여 알아보자.

    ˙ JAVA에서 from을 사용하는 이유에 대하여 알아보자.

 

3. 적용

    ① JAVA의 of와 from 사용 목적

        - 가독성과 유연성을 높이기 위해 도입된 JAVA의 문법적인 요소이다.

        - 주로 컬렉션과 배열을 다룰 때 사용되는 메소드 또는 생성자에 사용된다.

 

    ② of 사용방법

        - of는 주로 불변 컬렉션을 생성하기 위해 사용된다.

        - 이 메소드는 주어진 인수로부터 요소를 생성하고 해당 요소를 포함하는 불변 컬렉션을 반환한다.

        - 아래 코드는 1, 2, 3 세 개의 요소를 포함하는 불변 리스트를 생성한다.

        - 이는 배열 초기화와 유사한 효과를 가지며, 가독성이 높아지고 코드를 간결하게 작성할 수 있게 해준다.

1
List<Integer> numbers = List.of(123);
cs

 

    ③ from 사용방법

    - from은 주로 컬렉션 또는 배열로부터 다른 형태의 컬렉션을 생성할 때 사용된다.

    - 이와 같은 사용법은 기존 컬렉션을 이용하여 새로운 컬렉션을 생성할 때 유용하다.

    - 아래 코드는 existingList라는 기존 컬렉션을 이용하여 새로운 리스트를 생성한다.

1
2
List<Integer> existingList = Arrays.asList(123);
List<Integer> numbers = List.from(existingList);
cs

 

4. 결과

    ˙ 즉, 코드 간결화 및 가독성 향상을 위한 JAVA 문법으로써, 아래와 같이 Spring Framework에서 활용하자.

        - parameter로부터 DTO 또는 Entity를 생성할 때 of

        - Entity와 DTO 간 변환할 때 from

반응형
반응형

1. 시험환경

    ˙ SpringBoot

    ˙ Spring Data JPA

    ˙ MariaDB

 

2. 목적

    ˙ Pageable 기능을 이용하여 데이터 가져오는 방법을 알아보자.

 

3. 적용

    ① Spring Data JPA를 이용하여 DB 테이블 및 테스트 데이터를 생성하였다.

        - URL : https://languagestory.tistory.com/244

 

Spring Data JPA 설정 및 초기 데이터 생성

1. 시험환경 ˙ Spring Boot ˙ Spring-Data-JPA ˙ MariaDB 2. 목적 ˙ Spring Data JPA 설정하는 방법을 알아보자. ˙ Entity와 Repository만 작성하여 DB 테이블을 생성한다. ˙ Spring 프로젝트 실행 시 data.sql 초기 데이터

languagestory.tistory.com

 

    ② PagingAndSortingRepository를 상속 받는 Repository 인터페이스를 생성한다.

        - DB 데이터 조회 함수의 Paging 파라미터 및 Return Type을 선언한다.

1
2
3
4
5
6
7
8
9
10
11
12
package com.example.pageable.repository;
 
import com.example.pageable.domain.Nation;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
 
@RepositoryRestResource
public interface NationsRepository extends PagingAndSortingRepository<Nation, String> {
  Page<Nation> findAll(Pageable pageable);
}
cs

 

    ③ Controller에서 데이터를 읽어올 부분 PageRequest(page, size)를 정의하고 Pageable 변수를 전달한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package com.example.pageable.controller;
 
import com.example.pageable.domain.Nation;
import com.example.pageable.repository.NationsRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
 
 
@RestController
@RequiredArgsConstructor
public class NationController {
  private final NationsRepository nationsRepository;
 
  @GetMapping("/")
  public Page<Nation> pageableTest() {
 
    Pageable firstPageWithTwoElements = PageRequest.of(12);
    return nationsRepository.findAll(firstPageWithTwoElements);
  }
}
cs

 

4. 결과

    ˙ 페이지 당 건수 및 원하는 쪽수에 해당하는 데이터를 불러온다.

 

    ˙ 프로젝트 다운로드

pageable-jpa-example.zip
0.12MB

 

반응형
반응형

1. 시험환경

    ˙ Spring Boot

    ˙ MariaDB

 

2. 목적

    ˙ Spring-Rest-Data 패키지 설정하는 방법을 알아보자.

    ˙ Domain과 Repository만을 가지고 빠르게 REST API 서버를 구축하는 방법을 알아보자.

 

3. 적용

    ① Spring Data JPA를 이용하여 DB 테이블 및 테스트 데이터를 생성하였다.

        - URL : https://languagestory.tistory.com/244

 

Spring Data JPA 설정 및 초기 데이터 생성

1. 시험환경 ˙ Spring Boot ˙ Spring-Data-JPA ˙ MariaDB 2. 목적 ˙ Spring Data JPA 설정하는 방법을 알아보자. ˙ Entity와 Repository만 작성하여 DB 테이블을 생성한다. ˙ Spring 프로젝트 실행 시 data.sql 초기 데이터

languagestory.tistory.com

 

    ② Spring-Data-Rest 의존성 패키지를 설치한다.

        - src/build.gradle

1
2
implementation 'org.springdoc:springdoc-openapi-data-rest:1.6.15'
implementation 'org.springframework.boot:spring-boot-starter-data-rest'
cs

 

    ③ Spring-Data-Rest 설정하여, "/api"로 시작하는 URL은 Open API 로 제공한다.

        - src/main/resource/application.yaml

1
2
3
4
  data.rest:
    base-path: /api
    default-page-size: 10
    max-page-size: 10
cs

 

    ④ Entity 클래스를 정의한다.

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
31
32
33
package com.example.datarest.domain;
 
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
 
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
 
 
@Entity
@Getter
@ToString
public class Nation {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;
 
  @Setter
  private String nation;
 
  @Setter
  private int population;
 
  @Setter
  private String lang;
 
  @Setter
  private String currency;
 
}
cs

 

     Repository 인터페이스에 @RepositoryRestResource를 추가한다.

        -  Controller 및 Service 없이 미 정의된 로직에 따라 처리되어 Rest API 서버 개발이 가능하다.

1
2
3
4
5
6
7
8
9
10
package com.example.datarest.repository;
 
import com.example.datarest.domain.Nation;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
 
@RepositoryRestResource
public interface NationsRepository extends JpaRepository<Nation, String> {
}
 
cs

 

    ⑥ endpoint를 호출하는 방법은 각 엔티티 클래스에 s를 붙인 형태로하거나 Repository에서 지정할 수 있다.

        - @RepositoryRestResource(path = "endpoint명")

 

4. 결과

    ˙ 여기서는 endpoint를 지정하지 않았으므로 Entity 클래스 이름에 s를 추가하여 호출한다.

        - http://localhost:8080/api/nations

 

    ˙ 프로젝트 다운로드

data-rest-example.zip
0.12MB

반응형
반응형

1. 시험환경

    ˙ Spring Boot

    ˙ Spring-Data-JPA

    ˙ MariaDB

 

2. 목적

    ˙ Spring Data JPA 설정하는 방법을 알아보자.

    ˙ Entity와 Repository만 작성하여 DB 테이블을 생성한다.

    ˙ Spring 프로젝트 실행 시 data.sql 초기 데이터를 Insert 한다.

 

3. 적용

    의존성 패키지를 설치한다.

        - src/build.gradle

1
2
3
4
5
6
7
8
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    compileOnly 'org.projectlombok:lombok'
    runtimeOnly 'org.mariadb.jdbc:mariadb-java-client'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
cs

 

    MariaDB 연결 및 JPA 설정 부분을 작성한다.

        - src/main/resources/application.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
spring:
  datasource:
    url: jdbc:mariadb://[IP:PORT]/[DB]?characterEncoding=UTF-8
   username: [ID]
   password: [PASSWORD]
  jpa:
    defer-datasource-initialization: true
    hibernate:
      ddl-auto: create
      show-sql: true
    properties:
      hibernate.format_sql: true
      hibernate.default_batch_fetch_size: 100
  sql:
    init:
      mode: always
cs

 

    ② DB 테이블과 매치된 클래스인 Entity를 작성한다.

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
31
32
33
package com.example.datarest.domain;
 
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
 
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
 
 
@Entity
@Getter
@ToString
public class Nation {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;
 
  @Setter
  private String nation;
 
  @Setter
  private int population;
 
  @Setter
  private String lang;
 
  @Setter
  private String currency;
 
}
cs

 

    ③ CRUD를 위한 Repository 인터페이스를 생성한다.

1
2
3
4
5
6
7
8
9
package com.example.datarest.repository;
 
import com.example.datarest.domain.Nation;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
 
@RepositoryRestResource
public interface NationsRepository extends JpaRepository<Nation, String> {
}
cs

 

    ④ Entity 매핑 테이블에서 사용할 데이터를 작성한다.

        - src/main/resources/data.sql

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
insert into nation (nation, population, lang, currency) values
('America'50000'English''Dollar')
;
 
insert into nation (nation, population, lang, currency) values
('Swizerland'2000'Swiss''Frank')
;
 
insert into nation (nation, population, lang, currency) values
('England'60000'English''Found')
;
 
insert into nation (nation, population, lang, currency) values
('Italiy'4000'Italian''Euro')
;
cs

 

4. 결과

    ˙ Spring Boot 프로젝트를 실행 후 DB에서 Entity 매핑 테이블과 데이터가 초기화 되었는지 확인한다.

 

    ˙ 프로젝트 파일 다운로드

data-jpa-example.zip
0.12MB

반응형
반응형

1. 시험환경

    ˙ Springboot

    ˙ React.js

    ˙ build.gradle

 

2. 목적

    ˙ Springboot 프로젝트에서 React.js 프로젝트를 함께 배포한다.

 

3. 적용

    ① Springboot 프로젝트 안에서 React.js 프로젝트를 생성 및 연동하는 방법은 아래 내용을 참고한다.

        - 참고 : https://languagestory.tistory.com/234

 

Springboot 프로젝트에서 React.js 연동 설정

1. 시험환경 ˙ Springboot ˙ Gradle ˙ React.js ˙ axios 2. 목적 ˙ Spring Initializr를 이용하여 Springboot 프로젝트를 생성한다. ˙ React.js 프로젝트를 생성한다. ˙ Springboot와 React.js 연동을 위한 설정한다. ˙ Sprin

languagestory.tistory.com

 

    ② build.gradle에서 React.js 배포를 위한 설정 부분을 추가한다.

        - webDir 변수 : react.js 프로젝트를 생성한 경로

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
31
32
33
34
35
36
37
38
39
40
41
42
def webDir = "$projectDir/src/main/web"
 
sourceSets {
    main {
        resources {
            srcDirs = ["$projectDir/src/main/resources"]
        }
    }
}
 
processResources { dependsOn "copyReactBuildFiles" }
 
task installReact(type: Exec) {
    workingDir "$webDir"
    inputs.dir "$webDir"
    group = BasePlugin.BUILD_GROUP
    if (System.getProperty('os.name').toLowerCase(Locale.ROOT).contains('windows')) {
        commandLine "npm.cmd""audit""fix"
        commandLine 'npm.cmd''install' }
    else {
        commandLine "npm""audit""fix" commandLine 'npm''install'
    }
}
 
task buildReact(type: Exec) {
    dependsOn "installReact"
    workingDir "$webDir"
    inputs.dir "$webDir"
    group = BasePlugin.BUILD_GROUP
    if (System.getProperty('os.name').toLowerCase(Locale.ROOT).contains('windows')) {
        commandLine "npm.cmd""run-script""build"
    } else {
        commandLine "npm""run-script""build"
    }
}
 
task copyReactBuildFiles(type: Copy) {
    dependsOn "buildReact"
    from "$webDir/build"
    into "$projectDir/src/main/resources/static"
}
 
cs

 

    ③ 프로젝트 경로에서 빌드(build) 한다.

        - 빌드 명령어 : gradlew build

        - 빌드 결과 : [프로젝트홈]/build/libs

 

    ④ 빌드 파일(.jar)를 실행한다.

        - JAR 실행 명령어 : java -jar [빌드파일]

 

4. 결과

    ˙ Web에 접속하여 실행여부를 확인한다. (frontend 확인)

 

    ˙ 빌드파일을 실행한 콘솔로그를 확인한다. (backend 확인)

반응형
반응형

1. 시험환경

    ˙ Springboot

    ˙ Gradle

    ˙ React.js

    ˙ axios

 

2. 목적

    ˙ Spring Initializr를 이용하여 Springboot 프로젝트를 생성한다.

    ˙ React.js 프로젝트를 생성한다.

    ˙ Springboot와 React.js 연동을 위한 설정한다.

    ˙ Springboot와 React.js 배포를 위한 설정한다.

 

3. 적용

    ① 아래 포스팅을 참고하여 Springboot 프로젝트를 생성한다.

        - 참고 : https://languagestory.tistory.com/229

 

spring initializer를 이용한 springboot 프로젝트 생성

1. 시험환경 ˙ Window ˙ Spring Initializr ˙ Gradle ˙ IntelliJ Community 2. 목적 ˙ Spring Initializer를 이용하여 Spring Boot 프로젝트 패키지를 구성한다. ˙ Spring Initializer를 이용하여 구성된 패키지를 IntelliJ에 임

languagestory.tistory.com

 

    ② Springboot 프로젝트 안에서 react.js 프로젝트를 생성한다.

        - React.js 프로젝트 생성 경로 : [프로젝트홈]/src/main

        - React.js 프로젝트 생성 명령어 : npx  create-react-app  web

 

    ③ React.js "package.json"파일에서 Springboot으로 데이터 전달을 위한 proxy 설정을 한다.

 

    ④ React.js에서 RestAPI 통신을 위한 axios를 설치한다.

        - axios 설치명령어 : npm install axios --save

 

    ⑤ React.js에서 테스트 코드를 작성한다. (RestAPI 송신부)

 

    ⑥ index.js에서 <React.StrictMode> 부분을 주석처리한다.

        - 해당 부분을 주석처리 하지 않으면 RestAPI를 2번 호출한다.

 

    ⑦ Springboot에서 RestAPI 수신부 테스트 코드를 작성하고 프로젝트를 실행한다.

 

    ⑧ React.js 프로젝트를 실행한다.

 

4. 결과

    ˙ Web에 접속하여 React.js와 Springboot 간 연동 여부를 확인한다.

 

    ˙ 현재까지 설정한 내용을 바탕으로 Springboot와 React.js 배포 방법은 아래 포스팅을 참고한다.

        - 참고 : https://languagestory.tistory.com/235

 

Springboot 프로젝트와 React.js 프로젝트 연동 배포

1. 시험환경 ˙ Springboot ˙ React.js ˙ build.gradle 2. 목적 ˙ Springboot 프로젝트에서 React.js 프로젝트를 함께 배포한다. 3. 적용 ① Springboot 프로젝트 안에서 React.js 프로젝트를 생성 및 연동하는 방법은

languagestory.tistory.com

 

반응형
반응형

1. 시험환경

    ˙ Spring Initializr

    ˙ IntelliJ Community

    ˙ SpringBoot, Gradle, MyBatis, MySQL

 

2. 목적

    ˙ Spring Initializr를 이용하여 SpringBoot 프로젝트를 생성한다.

    ˙ MyBatis, MySQL 의존성 패키지를 추가하고 설정하는 방법을 알아보자.

    ˙ MyBatis를 이용하여 DB에 저장된 데이터를 Load하여 사용자에게 보여주는 코드를 작성하자.

 

3. 적용

    MySQL에서 샘플 데이터를 다음과 같이 생성한다.

        - DB 스키마 : crud-template

1
2
3
4
5
6
7
CREATE TABLE `nations` (
  `id` int unsigned NOT NULL,
  `country` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL,
  `population` int DEFAULT NULL,
  `language` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
cs

 

     SpringBoot 프로젝트 생성을 위해 Spring Initializr 사이트에 접속한다.

        - URL : https://start.spring.io/

 

     의존성 패키지를 추가하여 프로젝트를 생성한다.

template.zip
0.06MB

 

    IntelliJ에서 프로젝트 폴더를 임포트(import) 하면 프로젝트 빌드(build)가 자동으로 진행된다.

 

     MySQL 및 MyBatis를 설정한다.

        - 경로 : resources/application.properties

1
2
3
4
5
6
7
8
9
10
# MySQL
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/crud-template?characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=1q2w3e4r
 
# MyBatis
mybatis.type-aliases-package=com.template.crud.entity
mybatis.mapper-locations=classpath:/mybatis-mapper/**/*.xml
spring.datasource.sql-script-encoding=UTF-8
cs

 

    ⑥ 패키지를 추가하여 각 레이어별 코드를 작성한다.

        - resources/mybatis-mapper/NationsMapper.xml

1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 
<mapper namespace="com.mybatis.template.repository.NationsMapper">
 
    <select id="findAll" resultType="com.mybatis.template.entity.Nations">
        SELECT * FROM nations
    </select>
 
</mapper>
cs

 

        - com.mybatis.template.entity

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.mybatis.template.entity;
 
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
 
@Getter
@Setter
@ToString
public class Nations {
    private Long id;
    private String country;
    private int population;
    private String language;
}
cs

 

        - com.mybatis.template.repository

1
2
3
4
5
6
7
8
9
10
11
12
13
package com.mybatis.template.repository;
 
import com.mybatis.template.entity.Nations;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
 
import java.util.List;
 
@Repository
@Mapper
public interface NationsMapper {
    List<Nations> findAll();
}
cs

 

        - com.mybatis.template.service

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.mybatis.template.service;
 
import com.mybatis.template.entity.Nations;
import com.mybatis.template.repository.NationsMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
 
import java.util.List;
 
@Service
@RequiredArgsConstructor
public class NationsService {
    private final NationsMapper nationsMapper;
 
    public List<Nations> getAllNations() {
        return nationsMapper.findAll();
    }
}
cs

 

        - com.mybatis.template.controller

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package com.mybatis.template.controller;
 
import com.mybatis.template.service.NationsService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
 
@RequiredArgsConstructor
@RestController
public class NationsController {
    private final NationsService nationsService;
 
    @GetMapping("/nations")
    @ResponseBody
    public ResponseEntity getNations() {
        return ResponseEntity.ok(nationsService.getAllNations());
    }
}
 
cs

 

4. 결과

    ˙ 프로젝트를 실행하고 접속하여 DB에 저장된 데이터를 가져 오는지 확인한다.

 

반응형

+ Recent posts