728x90
반응형

Spring Boot + MySQL 연동

 

작성일자 : 2019.09.14

환경 : Spring Boot 2.1 MySQL 5.7 + Gradle, MyBatis

 

 

1. 연동 

 

1.1 ) Dependency 추가

 

build.gradle

 

...

dependencies {

...

   compile("org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.2")
   compile("commons-dbcp:commons-dbcp:1.4")
   compile("mysql:mysql-connector-java:5.0.8")

...

}

 

 

1.2 ) Config

 

DBConfig.java

 

package com.example.demo;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

@Configuration
public class DBConfig {

 

   @Bean
   public DataSource dataSource() {
      BasicDataSource dataSource = new BasicDataSource();

     

      // DB 정보 ( 환경에 맞게 수정 필요 )
      dataSource.setDriverClassName("com.mysql.jdbc.Driver");
      dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/rmsdb");  // jdbc:mysql://'domain':'port'/'DataBaseName'
      dataSource.setUsername("root"); // ID
      dataSource.setPassword("qweqweqwe"); // PW


      return dataSource;
   }

 

   @Bean
   public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
      SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
      sqlSessionFactory.setDataSource(dataSource);


      sqlSessionFactory.setMapperLocations(
         new PathMatchingResourcePatternResolver().getResources("classpath*:com/example/demo/*.xml")
      ); // Mapper 위치 설정


      return (SqlSessionFactory)sqlSessionFactory.getObject();
   }

   @Bean
   public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
      return new SqlSessionTemplate(sqlSessionFactory);
   }


}

 

++

Mybatis는 SqlSession이라는 자바 인터페이스를 이용

SqlSessionFactory에서 SqlSession를 생성

SqlSessionTemplate은 SqlSession을 구현하고 코드에서 SqlSession를 대체하는 역할

 

 

1.3 ) 연동 확인

 

Test Controller 생성 후 설정한 Bean 정보 출력

 

package com.example.demo;

import java.sql.SQLException;
import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class TestController {

   @Autowired
   DataSource dataSource;

   @Autowired
   SqlSessionFactory sqlSessionFactory;

   @Autowired
   SqlSessionTemplate sqlSessionTemplate;

   @RequestMapping("/check")
   public void test() throws SQLException {
      System.out.println(dataSource.getClass());
      System.out.println(sqlSessionFactory.getClass());
      System.out.println(sqlSessionTemplate.getClass());
      System.out.println(dataSource.getConnection());
   }
}

 

콘솔 확인

 

 

2. 기본 CRUD 세팅

 

MyBatis의 Mapper 연결 방식은

1. Mapper namespace를 직접 선언하여 연결하는 방식과

2. Mapper Interface를 활용하는 방식이 존재

 

해당 글에서는 Mapper namesapce를 직접 사용

 

 

TestDto.java

 

package com.example.demo;

 

public class TestDto {

 

        String id;

        String comment;

       

        public String getComment() {

               return comment;

        }

        public String getId() {

               return id;

        }

        public void setComment(String comment) {

               this.comment = comment;

        }

        public void setId(String id) {

               this.id = id;

        }

}

 

 

TestDao.xml

 

<?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.example.demo.TestDao">

           <select id="selectList" resultType="com.example.demo.TestDto">

                     SELECT *

                     FROM

                                testtable

           </select>

          

           <select id="selectOne" parameterType="com.example.demo.TestDto" resultType="com.example.demo.TestDto">

                     SELECT *

                     FROM

                                testtable

                     WHERE

                                id = #{id}

           </select>

          

           <insert id="create" parameterType="com.example.demo.TestDto">

                     INSERT INTO testtable ()

                     VALUES (

                                #{id},

                                #{comment}

                     )

           </insert>

          

           <update id="update" parameterType="com.example.demo.TestDto">

                     UPDATE testtable

                     SET

                                comment = #{comment}

                     WHERE

                                id = #{id}

           </update>

          

           <delete id="delete" parameterType="com.example.demo.TestDto">

                     DELETE

                     FROM

                                testtable

                     WHERE

                                id = #{id}

           </delete>

          

</mapper>

 

SqlSessionFactory의 Mapper 설정 위치 아래에 생성

mapper에서의 namespace 및 id는 DAO에서 Parameter로 사용

 

 

TestDao.java

 

package com.example.demo;

 

import java.util.List;

 

import org.mybatis.spring.SqlSessionTemplate;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Repository;

 

@Repository("TestDao")

public class TestDao {

       

        @Autowired

        private SqlSessionTemplate sqlSessionTemplate;

       

        public List<TestDto> selectList(){

               return sqlSessionTemplate.selectList("com.example.demo.TestDao.selectList");

        };

 

        public TestDto selectOne(TestDto testDto){

               return sqlSessionTemplate.selectOne("com.example.demo.TestDao.selectOne",testDto);

        };

       

        public int create(TestDto testDto){

               return sqlSessionTemplate.insert("com.example.demo.TestDao.create",testDto);

        };

       

        public int update(TestDto testDto){

               return sqlSessionTemplate.update("com.example.demo.TestDao.update",testDto);

        };

       

        public int delete(TestDto testDto){

               return sqlSessionTemplate.delete("com.example.demo.TestDao.delete",testDto);

        };

}

 

 

 

TestController.java

 

package com.example.demo;

 

import java.sql.SQLException;

 

import javax.sql.DataSource;

 

import org.apache.ibatis.session.SqlSessionFactory;

import org.mybatis.spring.SqlSessionTemplate;

import org.springframework.beans.factory.annotation.Autowired;

 

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

 

@Controller

public class TestController {

       

        @Autowired

        DataSource dataSource;

 

        @Autowired

        SqlSessionFactory sqlSessionFactory;

       

        @Autowired

        SqlSessionTemplate sqlSessionTemplate;

       

 

        @Autowired

        TestDao testDao;

       

        @RequestMapping("/check")

        public String test() throws SQLException {

               System.out.println(dataSource.getClass());

               System.out.println(sqlSessionFactory.getClass());

               System.out.println(sqlSessionTemplate.getClass());

               System.out.println(dataSource.getConnection());

               return "test";

        }

       

        @RequestMapping("/1")

        public String create() {

               TestDto testDto = new TestDto();

               testDto.setId("1");

               testDto.setComment("Comment");

               testDao.create(testDto);

               return "create";

        }

       

        @RequestMapping("/2")

        public String read() {

               TestDto testDto = new TestDto();

               testDto.setId("1");

               System.out.println(testDao.selectList());

               System.out.println(testDao.selectOne(testDto));

               return "read";

        }

       

        @RequestMapping("/3")

        public String update() {

               TestDto testDto = new TestDto();

               testDto.setId("1");

               testDto.setComment("update");

               testDao.update(testDto);

               return "update";

        }

       

        @RequestMapping("/4")

        public String delete() {

               TestDto testDto = new TestDto();

               testDto.setId("1");

               testDao.delete(testDto);

               return "delete";

        }

}

 

 

 

 

DB Schema

 

CREATE TABLE `testtable` (
  `id` varchar(45) NOT NULL,
  `comment` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id`)
)

 

 

---------

 

위 설정 후 Controller로의 URL 접근을 통해 CRUD 기능 동작 확인 가능

 

1. Create

 

 

 

2. Read

 

각각 List와 Obejct 형태

 

 

3. Update

 

 

4. Delete

 

 

Project 구조

 

 

-----------

++

Mapper Interface 활용 방식

 

in java

@Mapper
public interface MapperInterface {
   List selectList();
   TestDto selectOne(TestDto testDto);
   int create(TestDto testDto);
   int update(TestDto testDto);
   int delete(TestDto testDto);
}

 

 

In .xml

<mapper namespace="com.example.demo.MapperInterface">

   ...

</mapper>

이 경우 SqlSessionTemplate, SqlSessionFactory 설정은 필요 X

 

++

xml 없이 Mapper Interface에 SQL을 설정하는 방법도 있다

ex)

 

@Mapper
public interface MapperAnnotation {
   @Select("SELECT * FROM testtable")
   List selectList();

   @Select("SELECT * FROM testtable WHERE id = #{id}")
   TestDto selectOne(TestDto testDto);

   @Insert("INSERT INTO testtable () VALUES (#{id}, #{comment})")
   int create(TestDto testDto);

   @Update("UPDATE testtable SET comment = #{comment} WHERE id = #{id}")
   int update(TestDto testDto);

   @Delete("DELETE FROM testtable WHERE id = #{id}")
   int delete(TestDto testDto);
}

728x90
반응형

'Java' 카테고리의 다른 글

리스트 순환 중 아이템 삭제  (0) 2019.12.08
[Spring] Cache 적용  (0) 2019.09.28
[spring boot] AOP 설정  (0) 2019.07.21
[Spring Boot-Vue] 프로젝트 빌드  (0) 2019.07.21
[Spring Boot] JPA(Hibernate) 적용  (0) 2019.07.06
728x90
반응형

작성일자 : 2019.09.07

 

1. 괄호 위치

 

GNU

if( )

   {

       doSomething..

   }

 

K&R

if( ){

    doSomething..

}

 

BSD

if( )

{

   doSomething..

}

 

 

2. 변수, 함수 명칭

 

카멜 표기법

ex) codingStyle

 

파스칼 표기법

ex) CodingStyle

 

스네이크 표기법

ex) coding_style

 

케밥 표기법

ex) coding-style

728x90
반응형

'용어 정리' 카테고리의 다른 글

함수 표현식 / 함수 선언식  (0) 2021.03.05
ECMAScript / JavaScript  (0) 2021.02.11
J2SE/J2ME/J2EE  (0) 2018.04.22
CPU/Core/Processor  (0) 2018.04.07
업데이트, 패치, 업그레이드  (0) 2018.02.09
728x90
반응형

[spring boot] AOP 설정

 

작성일자 : 2019.07.21

환경 : Spring Boot 2.1.6, Gradle 3

 

 

추가 및 수정 파일

 

0. 기본 개념

 

1) 관점(Aspect)

구현하고자 하는 횡단 관심사의 기능, 한개 이상의 포인트컷과 어드바이스의 조합으로 만들어진다.

 

2) 조인포인트(Join point)

관점(Aspect)를 삽입하여 어드바이스가 적용될 수 있는 위치

 

3) 어드바이스(Advice)

관점(Aspect)의 구현체로 조인 포인트에 삽입되어 동작하는 코드 



 

1. AOP 의존성 추가

 

build.gradle

..

dependencies {

   ..

   compile('org.springframework.boot:spring-boot-starter-aop')

   ..

}

 

 

 

 

2. AOP 사용 설정

 

ProjectApplication.java

 

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

@SpringBootApplication
@EnableAspectJAutoProxy // Enable AOP
public class AoptestApplication {
   public static void main(String[] args) {
      SpringApplication.run(AoptestApplication.class, args);
   }

}

 

 

 

3. AOP를 적용할 대상 구현

 

AopController.java

 

package com.example.demo;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import org.springframework.web.bind.annotation.*;

@RestController
public class AopController {
    private static final Logger logger = LoggerFactory.getLogger(AopController.class);

    @GetMapping("/hello")
    public void hello(){
        logger.info("hello AOP");
    }

}

 

 

 

4. AOP 설정 파일 추가

 

AopConfig.java

 

package com.example.demo;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class AopConfig{
    private static final Logger logger = LoggerFactory.getLogger(AopConfig.class);

    @Before("execution(* com.example.demo.AopController.*(..))")
    public void doSomethingBefore() {
        logger.info("AOP Test : Before ");
    }

    @After("execution(* com.example.demo.AopController.*(..)) ")
    public void doSomethingAfter() {
        logger.info("AOP Test : After");
    }
}

 

적용 대상의 실행 전,후에 각각 aspect 동작하도록 설정

 

 

# Advice 종류

 

@Before : 조인포인트 전에 실행 
@AfterReturning : 조인포인트에서 성공적으로 리턴 된 후 실행
@AfterThrowing : 예외가 발생하였을 경우 실행
@After : 조인포인트에서 메서드의 실행결과에 상관없이 무조건 실행
@Around : 조인포인트의 전 과정(전, 후)에 수행

 

 

# execution 포인트컷 예

 

execution([수식어] [리턴타입] [클래스이름] [이름]([파라미터])

 

 

 

5. 확인

 

대상 접근

로그 확인

 

 

728x90
반응형

'Java' 카테고리의 다른 글

[Spring] Cache 적용  (0) 2019.09.28
Spring Boot + MySQL 연동  (0) 2019.09.14
[Spring Boot-Vue] 프로젝트 빌드  (0) 2019.07.21
[Spring Boot] JPA(Hibernate) 적용  (0) 2019.07.06
[Spring Boot] Eclipse 내 Lombok 설치  (0) 2019.07.05
728x90
반응형

[vue] vuetify 사용 설정

 

작성일자 : 2019.07.21

환경 : Vue 2.6.10, Vue-Cli 2.9.10, npm 6.9.0, webpack 3.12.0

 

 

1. vuetify 추가

 

%ProjectPath%> npm install vuetify

 

node_modules 밑에 vuetify 생성 확인

 

 

 

2. vuetify 사용 설정

 

%ProjectPath%> vue add vuetify

 

아래 설정이 자동으로 추가됨

 

main.js

...
import vuetify from './plugins/vuetify'
new Vue({
  render: h => h(App),
  vuetify,
  router
}).$mount('#app')

...

 

src/plugins/vuetify.js

import Vue from 'vue';
import Vuetify from 'vuetify/lib/framework';

Vue.use(Vuetify);

export default new Vuetify({
});

 

src/components/HelloWorld.vue

<template> 
   ...
   ...
</template>

<script>
   export default {
      ...
      ...
   }
</script>

 

app.vue template 수정

 

 

3. 확인

 

vuetify 버튼 적용 확인

 

 

<template>
  <v-app id="app">
    <v-btn color="success">Success</v-btn
    <v-btn color="error">Error</v-btn>
    <v-btn color="warning">Warning</v-btn>
    <v-btn color="info">Info</v-btn>
  </v-app>
</template>

 

접근 시 vuetify 버튼 확인 가능

 

4. 사용 예시

 

vuetify 홈페이지에서 추가하고 싶은 Component를 찾기

https://vuetifyjs.com/ko/components/api-explorer

 

'Footer를 만들어보자'

 

예제 우측 상단 <> 버튼을 누르면 template과 script 코드가 나온다

 

 

foorter.vue 생성 후 template, script 복붙

 

 

 

컴포넌트를 사용할 vue에 추가

 

...
<script>
import vfooter from '@/components/footer'
export default {
   name: 'App',
   components: {
      vfooter
   }
}
</script>
...

 

template에 추가 

# vuetify 컴포넌트는 <v-app> 태그 안에 존재해야함

 

 

footer 추가 확인

728x90
반응형

'도구, 툴 > 세팅' 카테고리의 다른 글

[React] 기본 프로젝트 띄우기  (0) 2019.11.03
SVN 저장소 설정  (0) 2018.07.21
GIT 저장소 설정  (0) 2018.07.15
node.js 설치  (0) 2018.06.10
VSCode 설치  (0) 2018.06.10
728x90
반응형

[Spring Boot-Vue] 프로젝트 빌드

 

작성일자 : 2019.07.21

환경 : Vue 2.6.10, Vue-Cli 2/3, Spring Boot 2.1.6, npm 6.9.0, webpack 3.12.0

목표 : Spring Boot - Vue 구조의 프로젝트를 빌드하여 하나의 jar파일을 생성

 

0. Vue / Spring Project 세팅

 

- vue 버전 확인

npm list vue

 

- vue-cli 버전 확인

vue --version

 

- vue-cli에서 프로젝트 생성

vue cli 2.X :

  vue init webpack 'ProjectName' 

vue cli 3.X :

   vue create 'ProjectName'


1. vue 프로젝트 빌드

 

- 빌드할 대상은 vue-cli로 생성한 Default 프로젝트 ( 추가 설정 X )

 

 

Build 명령어

 

- vue cli 2.X :

%VueProjectRootPath% > npm run-script build

- vue cli 3.X :

%VueProjectRootPath% > npm run build

 

Default 설정 시 빌드 후 %VueProjectRootPath%\dist에서 빌드 결과물을 확인 가능

 

 

 

빌드 결과물을 %SpringBootProjectRootPath%\src\main\resources\static 밑으로 이동

 

 

해당 과정까지 진행 시 Spring Boot 서버 실행 후 /로 접근 시 vue 화면에 접근 가능

 

 

2. Spring Boot 빌드

 

빌드할 대상은 SpringBoot Default 프로젝트 ( 추가 설정 X )

 

Build 명령어

 

%SpringBootProjectRootPath%> gradlew build

 

 

Default 설정 시 빌드 후 %SpringBootProjectPath%\build\libs에서 빌드 결과물을 확인 가능

 

 

3. 확인

 

결과물 실행

 

%SpringBootProjectPath%\build\libs> java -jar buildtest-0.0.1-SNAPSHOT.jar

 

 

 

jar 파일 실행 후 / 접근 시 vue 기본화면 확인 가능

 

 

---

 

++

실행 시 java, javaw 명령어 차이

java는 cmd창에 콘솔로그가 찍히며 cmd 종료 시 프로세스 종료

javaw는 백그라운드로 실행 

 

++

Vue Project Build 결과물 경로 설정 방법

vue cli 3.X 으로 생성한 Vue Project 일 시

 

ROOT 밑에 vue.config.js 파일 추가

const path = require("path");

 

module.exports = {

  outputDir: path.resolve(__dirname"../src/main/resources/static"),

  //   assetsDir:  "./"  - asset 폴더 위치 설정

}

 

 

728x90
반응형

'Java' 카테고리의 다른 글

Spring Boot + MySQL 연동  (0) 2019.09.14
[spring boot] AOP 설정  (0) 2019.07.21
[Spring Boot] JPA(Hibernate) 적용  (0) 2019.07.06
[Spring Boot] Eclipse 내 Lombok 설치  (0) 2019.07.05
[Spring Boot] 개발 환경 세팅  (2) 2019.07.05
728x90
반응형

[Spring boot] Logback 설정

 

작성일자 : 2019.07.14

환경 : Spring Boot 2.1.6

 

Logback이란 SLF4J의 구현체로 자바 오픈소스 로깅 프레임워크

 

# Spring Boot의 기본 로그 객체로 포함되어 있어 Gradle이나 Maven 설정없이 바로 사용 가능

# spring-boot-starter-web 안에 spring-boot-starter-logging 포함

 

 

1. 사용 방법

 

application.properties

..

..

# 전체 로그 레벨 설정

logging.level.root=info

 

 

# 특정 클래스만 설정

logging.level.com.example.demo.SpringboottestApplication=debug

..

..

 

 

MyClass.java

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory;

 

public class MyClass {

 

       private static final Logger logger = LoggerFactory.getLogger(MyClass.class);

 

       public void method() {

 

               logger.info("info");

               logger.debug("debug");

               

       }

 

}

 

2. 결과

 

Console에서 로그 내용 확인 가능

 

----

 

로그 레벨

이미지 출처 : http://myblog.opendocs.co.kr/archives/tag/%EB%A1%9C%EA%B7%B8-%EB%A0%88%EB%B2%A8

728x90
반응형

'도구, 툴' 카테고리의 다른 글

[docker] 기본 명령어  (0) 2020.05.24
GIT example  (0) 2020.05.01
[ELK] Kibana  (1) 2019.01.29
[ELK] Logstash  (0) 2019.01.28
[ELK] Elasticsearch  (0) 2019.01.24
728x90
반응형

[Spring Boot] CORS 해결

 

작성일자 : 2019.07.07

환경 : Spring Boot 2.1.6

 

다른 도메인에서의 자원을 호출하는 행위에 제한이 없을 경우 안전하지 않습니다. CORS (Cross-Origin Resource Sharing)는 이렇게 시스템 수준에서 타 도메인 간 자원 호출을 승인하거나 차단하는 것을 결정하는 것입니다. 여기서 Access-Control-Allow-Origin 란 CORS 의 헤더를 의미합니다.

Same Origin Policy에 의해 Script에 의한 cross-site http requests는 허용되지 않습니다. 즉 Ajax를 사용하여 통신을 하고 Front와 Back을 구별하여(ex Spring Boot + Vue.js) 개발하는 구조의 웹 서비스는 개발단계에서 서버와의 통신을 위해 추가로 설정이 필요합니다. 

 

GpConfig.java

package com.example.demo;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
@EnableWebMvc
public class GpConfig implements WebMvcConfigurer{
    @Override
    public void addCorsMappings(CorsRegistry cr) {
        cr.addMapping("/**")
            .allowedOrigins("http://127.0.0.1:8081")  // 허용할 주소 및 포트
            .allowedOrigins("http://localhost:8081");  // 허용할 주소 및 포트
    }

}

 

ProjectApplication.java 와 동일하거나 그 하위에 위치한 폴더에 작성

728x90
반응형
728x90
반응형

[Spring Boot] JPA(Hibernate) 적용

 

환경 : Spring Boot 2.6.4, MySQL 5.7, Spring-data-jpa, Lombok

 

ORM(Object Relational Mapping) : 객체와 관계형 데이터베이스의 데이터를 자동으로 연결해주는 것

JPA(Java Persistence API) : 자바에서의 ORM을 위한 표준 기술 명세이자 인터페이스의 모음

Hibernate : JPA의 구현체 ( EclipseLink, DataNucleus 도 존재하나, Hibernate 가 메인 ) 

Spring-data-jpa : JPA 사용을 도와주는 모듈, 내부적으로 Hibernate를 사용

Repository : Spring-data-jpa 모듈에서 제공하는 JPA를 한단계 추상화시킨 인터페이스

 

 

0. Lombok 및 프로젝트 기본 설정 

 

 

1. Gradle 설정

spring-data-jpa 및 MySQL Connector 의존성 추가

dependencies {

..

   implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

   compile("mysql:mysql-connector-java:5.1.34")

..

}

 

추가 후 Gradle Sync or Refresh

 

 

2. application.properties 설정

 

DB 정보 추가

# 각 행 뒤에 공백 주의!

spring.datasource.driver-class-name=com.mysql.jdbc.Driver

spring.datasource.url=jdbc:mysql://'DB-EndPoint':'Port'/'DBName'
spring.datasource.username=dbUser 
spring.datasource.password=dbPassword 
# 각 환경에 맞게 수정 필요


spring.jpa.properties.hibernate.format_sql=true
# 정렬된 SQL 출력  

spring.jpa.show-sql=true
# 사용되는 SQL 콘솔창에 출력

spring.jpa.hibernate.ddl-auto=create
# 객체에 매핑되는 기존 테이블 자동 드랍 및 새로운 테이블 생성

 

 

3. 객체(모델) 생성

 

Product.java

package com.example.demo;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@Entity
public class Product {
    @Id
    @GeneratedValue // Auto IncId Generator
    private Long id;

    @Column(length = 20, nullable = false)
    private String name;

    @Column(columnDefinition = "TEXT", nullable = true)
    private Integer price;

    private String memo;

    @Builder
    public Product(String name, Integer price, String memo) {
        this.name = name;
        this.price = price;
        this.memo = memo;
    }
}

 

4. Repository 생성

 

ProductRepository.java

package com.example.demo;
import org.springframework.data.jpa.repository.JpaRepository;

public interface ProductRepository extends JpaRepository<Product, Long>{

}

 

 

5. 확인

4. 까지 설정 후 어플리케이션을 실행하면 해당 데이터베이스에 자동으로 객체에 매핑되는 테이블이 생성된다

 

콘솔

MySQL 

product 테이블 및 객체에 선언했던 id,memo,name,price 칼럼 생성

@GeneratedValue에 의한 Auto Inc Sequence용 hibernate_sequence 테이블생성

 

 

6. CRUD 사용 예시

 

In Controller

@RestController
public class ProductController {

@Autowired
private ProductRepository productRepository;

..

..

}

 

6-1. Create

 

In Controller

...

@GetMapping("/create")  
public void create(Product product) {
productRepository.save(product);
}

...

 

URL로 접근

 

Console

In DB

 

 

 

6-2. Read

 

In Controller

..

@GetMapping("/readOne")
public Optional readOne(Long id) {
return productRepository.findById(id);
}

@GetMapping("/readAll")
public List readAll() {
return productRepository.findAll();
}

..

 

URL 접근

readAll의 경우 리스트 형태로 온 것을 확인 가능 ( '[ ]' )

 

In Console

 

6-3. Update

Update의 경우 PK를 지정하여 save를 하거나, 직접 만든 쿼리를 사용하며, 해당 과정에서는 직접 만든 쿼리를 사용

 

In Controller

..

@GetMapping("/update")
public void update(Product product, Long id) {
productRepository.update(product, id);
}

..

 

In Repository

..

@Modifying
@Transactional
@Query(value="UPDATE mydbinstance.product m SET m.name=:#{#product.name}, m.memo=:#{#product.memo}, m.price=:#{#product.price} WHERE m.id = :id", nativeQuery=true)
void update(@Param("product") Product product, @Param("id") Long id);

 

..

 

URL 접근

 

Console

In DB

수정 전

 

수정 후

 

 

6-4. Delete

 

In Controller

..

@GetMapping("/delete")
public void delete(Long id) {
productRepository.deleteById(id);
}

..

URL 접근

 

Console

 

In DB

삭제 전

삭제 후

 

---

 

전체 소스

 

Product.java

package com.example.demo; 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.Id; 

import lombok.AccessLevel; 
import lombok.Builder; 
import lombok.Getter; 
import lombok.NoArgsConstructor; 

@NoArgsConstructor(access = AccessLevel.PROTECTED) 
@Getter 
@Entity 
public class Product { 
    @Id 
    @GeneratedValue 
    private Long id; 

    @Column(length = 20, nullable = false) 
    private String name; 

    @Column(nullable = false) 
    private Integer price; 

    @Column(nullable = true)
    private String memo; 

    @Builder 
    public Product(String name, Integer price, String memo) { 
        this.name = name; 
        this.price = price; 
        this.memo = memo; 
    } 
}

 

ProductController.java

package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
import java.util.Optional;

@RestController
public class ProductController {

@Autowired
private ProductRepository productRepository;

@GetMapping("/hello")
public String hello() {
return "Hello World";
}

@GetMapping("/create")
public void create(Product product) {
productRepository.save(product);
}

@GetMapping("/readOne")
public Optional readOne(Long id) {
return productRepository.findById(id);
}

@GetMapping("/readAll")
public List readAll() {
return productRepository.findAll();
}

@GetMapping("/update")
public void update(Product product, Long id) {
productRepository.update(product, id);
}

@GetMapping("/delete")
public void delete(Long id) {
productRepository.deleteById(id);
}
}

 

ProductRepository.java

package com.example.demo; 
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.transaction.annotation.Transactional; 

public interface ProductRepository extends JpaRepository<Product, Long>{ 

@Modifying
@Transactional
@Query(value="UPDATE mydbinstance.product m SET m.name=:#{#product.name}, m.memo=:#{#product.memo}, m.price=:#{#product.price} WHERE m.id = :id", nativeQuery=true)
void update(@Param("product") Product product, @Param("id") Long id);

 

build.gradle

plugins {
id 'org.springframework.boot' version '2.1.6.RELEASE'
id 'java'
}

apply plugin: 'io.spring.dependency-management'

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
mavenCentral()
}

configurations { compileOnly { extendsFrom annotationProcessor } }

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    compile("mysql:mysql-connector-java:5.1.34")
    
    compileOnly 'org.projectlombok:lombok' 
annotationProcessor 'org.projectlombok:lombok'
}

 

application.properties

spring.datasource.driver-class-name=com.mysql.jdbc.Driver

spring.datasource.url=jdbc:mysql://mydbinstance.ctueexvldsoh.ap-northeast-2.rds.amazonaws.com:3306/mydbinstance
spring.datasource.username=qwe
spring.datasource.password=qweqweqwe
# 각 환경에 맞게 수정 필요


spring.jpa.properties.hibernate.format_sql=true
# 정렬된 SQL 출력  

spring.jpa.show-sql=true
# 사용되는 SQL 콘솔창에 출력

spring.jpa.hibernate.ddl-auto=create
# 객체에 매핑되는 기존 테이블 자동 드랍 및 새로운 테이블 생성

 

모든 java파일은 ProjectAppication.java과 같거나 하위폴더에 생성

 

728x90
반응형

'Java' 카테고리의 다른 글

[spring boot] AOP 설정  (0) 2019.07.21
[Spring Boot-Vue] 프로젝트 빌드  (0) 2019.07.21
[Spring Boot] Eclipse 내 Lombok 설치  (0) 2019.07.05
[Spring Boot] 개발 환경 세팅  (2) 2019.07.05
[spring] Controller -> JSP 데이터 전달  (0) 2019.06.28
728x90
반응형

[Spring Boot] Lombok 설치

 

환경 : Eclipse 2018.12, Spring Boot 2.16 with Gradle 3

작성일자 : 2019.07.05

 

1. Gradle 설정 추가

configurations { compileOnly { extendsFrom annotationProcessor } }

dependencies {

..

compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'

..

}

 

2. Gradle 동기화

프로젝트 우클릭 > Gradle > refresh Gradle Project

 

 

3. 설치

Eclipse 내 lombot jar 파일의 path를 참조하여 해당 경로의 jar 파일 직접 실행(cmd or 더블클릭)

Specify Location > 이클립스 실행파일 선택 > Install / Update > 이클립스 재시작

 

 

728x90
반응형

'Java' 카테고리의 다른 글

[Spring Boot-Vue] 프로젝트 빌드  (0) 2019.07.21
[Spring Boot] JPA(Hibernate) 적용  (0) 2019.07.06
[Spring Boot] 개발 환경 세팅  (2) 2019.07.05
[spring] Controller -> JSP 데이터 전달  (0) 2019.06.28
[Spring] JUnit 적용하기  (0) 2018.10.23
728x90
반응형

[Spring Boot] 개발 환경 세팅

 

환경 : JDK 1.8, Eclipse Photon(2018.12), Spring Boot 2.1.6, Gradle 3, STS(Plugin)

 

1. JDK 1.8 설치

https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

 

2. Eclipse 설치

https://www.eclipse.org/eclipseide/2018-12/

 

3. STS 플러그인 설치

Eclipse > Help > Eclipse Marketplace... > STS 검색 후 설치

 

4. 프로젝트 생성

New > Project 

5. 실행

프로젝트 우클릭 > Run as > Spring Boot App

 

6. 확인

브라우저로 localhost:8080 접근

 

Spring과는 다르게 기본페이지가 없다 기본 에러페이지가 보인다면 성공

 

---

++ 2019.07 기준 Eclipse 2019 버전은 STS 4 플러그인 설치 시 Spring Boot Starter가 보이지 않는다

++ 'ProjectName'Application.java와 동일한 위치나 하위 패키지에 속한 모든 컴포넌트들은 실행될 때 자동으로 스캔

 

Controller Example

package com.example.demo;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class Hello {

@GetMapping("/hello")
public String hello() {
return "Hello Spring Boot!!";
}
}

728x90
반응형

+ Recent posts