Kotlin으로 Spring Boot 개발하기 - 가입 기능, 데이터베이스, 암호화

Yuri Lee·2020년 9월 21일
1

데이터베이스 구현

  • JPA 설명
    • 과거 데이터베이스 연결은 SQL 문으로
    • 더이상 sql문은 쓰지 않는다.
    • 추상화된 ORM(Object-Relational Mapping)
    • 데이터베이스가 바꿔도 코드는 그대로

JPA는 Repository Interface, Database interface 두가지가 있다. Repository Interface를 우리가 실제로 구현하는 것이다. 처음에는 H2 드라이버를 사용한다. 하지만 실제로 웹애플리케이션을 구동할 때는 mysql을 사용하는 편이다. 그냥 간단하게 설정만 하면 H2에서 mysql로 넘어갈 수 있다!

spring.mustache.suffix=.html
spring.datasource.name=demo
spring.datasource.initialize=false
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.url=jdbc:h2:file:~/demo

사용할 DB 환경설정

  • @Entity, User 타입 정의
  • Repository 인터페이스
  • Repository 사용, @Autowire
  • repository.save로 User 저장

primary key는 자동으로 생성된다. 그래서 GeneratedValue 어노테이션을 활용함.

demo라는 db에 user table을 만든 셈이다.

http://localhost:8080/h2-console 로 들어가면

다음과 같은 화면을 볼 수 있다. 여기서 demo 를 입력하고 connect를 눌러보자.

다음과 같이 user table이 만들어졌음을 확인할 수 있다.


repository interface 에 있는 데이터를 어떻게 가져올지에 대한 정의만 해주면 JPA가 다른 데이터를 사용하더라도.. 잘 사용할 수 있다 ..!

CrudRepository(템플릿 레파지토리) 무엇을 가져오는가, 어떤 엔티티를 가져오는 가를 앞에 적어준다. User를 가져와야 하므로 User를 앞에 적어준다. 그리고 뒤에는 어노테이션을 붙여준 id타입을 적어준다. 우리는 Long이였음..!

findbyId, save 등등의 함수를 사용할 수 있다.

어떤 엔티티이든 id는 꼭 있어야 한다. 따라서 id로 찾는 것은 의미가 있다?

Repository 사용

  • Autowire
  • repository.save로 User 저장
  • @RequestParam(value = ...)

sign.html

{{> header }}
<h1>Sign</h1>
<form action="/sign" method="post">
    id: <br/>
    <input name="id" type="text"/>
    <br/>
    password: <br/>
    <input name="password" type="password"/><br/>
    <input type="submit" value="submit">
</form>

{{> footer }}

HtmlController.kt

    @PostMapping("/sign")
    fun postSign(model: Model, userId:String, password:String) {
        
    }

일치하도록 해주는 어노테이션을 작성해야 하는데 .. 그게 바로 @RequestParam이다.

스트링부트에 있는 JPA가 이것을 설정해주었음 .. !!

보안강화를 위한 비밀번호 암호화

  • 비밀번호 보안을 위해 비밀번호를 저장하지 않는다.
  • 비밀번호르 암호화한다 .
  • SHA-256 암호화

HtmlController.kt

package com.example.demo

import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Controller
import org.springframework.ui.Model
import org.springframework.web.bind.annotation.*
import java.lang.Exception
import java.security.MessageDigest

@Controller
class HtmlController {

    @Autowired
    lateinit var repository:UserRepository // 나중에 초기화를 해준다?!

    @RequestMapping("/")
    fun index(model:Model) : String {
        model.addAttribute("title","home")
        return "index"
    }

    fun crypto(ss:String):String {
        val sha=MessageDigest.getInstance("SHA-256")
        val hexa = sha.digest(ss.toByteArray())
        val crypto_str=hexa.fold("",{str, it -> str + "%02x".format(it)})
        return crypto_str
    }
    @GetMapping("/{formType}")
    fun htmlForm(model: Model, @PathVariable formType:String) : String {

        var response : String=""

        if (formType.equals("sign")) {
            response="sign"
        }
        else if (formType.equals("login")) {
            response="login"
        }

        model.addAttribute("title", response)

        return response
    }

    @PostMapping("/sign")
    fun postSign(model: Model,
                 @RequestParam("id") userId:String,
                 @RequestParam("password") password:String) : String {

        try {
            val cryptoPass=crypto(password)

            repository.save(User(userId, cryptoPass))
        } catch (e:Exception) {
            e.printStackTrace()
        }
        model.addAttribute("title", "login")
        return "login"
    }
}


[Reference]

이 글은 유투버 kwangsung choi의 코틀린 스프링부트 강좌를 바탕으로 정리한 내용입니다.

profile
Step by step goes a long way ✨

0개의 댓글