backend
  • README
  • DOCS
    • Java Docs
    • Servlet Docs
    • JSP Docs
    • DB & SQL Docs
    • Spring Boot Docs
    • Spring Security Docs
    • AWS Docs
  • 설치하기
    • Intellij 설정
  • 자바
    • 01 Java란?
    • 02 자바 시작하기
    • 03 자료형과 연산자
    • 04 제어문
    • 05 메소드
    • 06 클래스 기초
      • Static 보충자료
      • 패키지 보충자료
    • 07 객체지향 프로그래밍
    • 08 클래스 더 알아보기
      • 열거형 ENUM 보충자료
    • 09 클래스와 자료형
      • 다형성 보충자료
      • 제네릭 보충자료
    • 10 컬렉션 프레임워크
      • 컬렉션 프레임워크 보충자료
    • 11 람다식과 함수형 프로그래밍
      • 람다식 보충자료
    • 12 오류 대비하기
      • 오류 보충자료
    • 13 멀티태스킹
      • 멀티태스킹 보충자료
    • 교재보충
      • java.lang
  • 스프링
    • 서블릿, JSP
      • 05 Servlet(서블릿)
        • 서블릿 보충자료
        • 서블릿 추가코드
        • XML, YAML, JSON
      • 06 JSP(자바 서버 페이지)
        • JSP 보충자료
      • 07 JSTL(JSP 스탠다드 태그 라이브러리)
        • JSTL 보충자료
      • 08 Cookie(쿠키), Session(세션)
      • 09 서블릿,필터,리스너
        • 서블릿,필터,리스너 보충자료
      • 11 도서관리 프로젝트 실습
    • Spring Boot
      • 01 스프링 등장 배경, 객체지향
        • 스프링 등장 배경, 객체지향 보충자료
      • 02 IOC(제어의 역전), DI(의존성 주입)
        • IOC 보충자료
        • DI 보충자료
      • 03 스프링 구조
        • 스프링 구조 보충설명
      • 04 테스트코드 실습
      • 05 스프링 빈 설정
        • 스프링 빈 설정 보충자료
      • 06 싱글톤
        • 싱글톤 보충 자료
      • 07 스프링 빈 자동설정
        • 스프링 빈 자동설정 보충자료
      • 08 빈 생명주기
        • 빈 생명주기 보충자료
      • 09 빈 스코프
        • 빈 스코프 보충자료
      • 10 스프링 MVC
        • 스프링 MVC 보충자료
        • 데이터베이스 연동에 필요한 부분
      • 11 Validation(검증)
        • Validation(검증) 보충자료
      • 12 Bean Validation(빈검증)
        • Bean Validation(빈검증) 보충자료
      • 13 예외처리
        • 예외처리 보충자료
      • 14 타입변환
      • 15 JDBC(Java Database Connectivity)
      • 16 커넥션풀
      • 17 트랜잭션
        • 트랜잭션 보충자료
      • 18 JDBC 템플릿 활용
      • 19 MyBatis
      • 20 JPA(Java Persistence API)
      • 22 게시판 프로젝트 실습
    • Spring Security
      • 보안(Security)
      • Spring Security
      • 2. Spring Security 알아보기
        • 보안 위협 실제 사례와 방어 전략
      • 3. Spring Security 기본 동작 흐름
      • 4. Spring Security로 인증 권한 추가하기
        • Spring Security의 인증 및 인가
      • 5. Spring Security에서 세션 관리하기
        • 세션(Session)과 쿠키(Cookie) 비교, 토큰(Token)과의 관계
        • 해싱 및 해싱알고리즘
        • base64
      • 6. Spring Security 악용 보호
        • SameSite
      • 7. Spring Security로 인가 권한 추가하기
      • 8. Bcrypt(비크립트) 암호화
      • OAuth2 적용하기
  • 네트워크
    • HTTP
    • OSI 7계층
  • DB&SQL
    • 01 Database(데이터베이스)와 SQL 개요
    • 02 관계형 모델
    • 03 집합
    • 04 JOIN 연산
    • 05 MySQL
      • 세이브포인트
      • DBeaver, Mysql 오토커밋 설정 관련
    • 06 SQL 기초
      • 예시데이터 쿼리문
    • 07 SQL 실습
      • 실습 스키마
    • 08 Join 활용
      • 실습스키마
    • 09 SQL 활용
      • 실습스키마
    • 10 정규화
      • 실습 스키마
    • 데이터타입
    • 예시 프로젝트 스키마 구성
  • AWS
    • SSL 연결하기
    • 보충설명
Powered by GitBook
On this page
  1. 스프링
  2. Spring Boot
  3. 10 스프링 MVC

데이터베이스 연동에 필요한 부분

테이블은 먼저 등록되어있어야함! 프로젝트에 맞게 테이블 작성 후 아레 repository 로직 참고 하여 작성

jdbc 주석 밑에 라이브러리 추가

plugins {
	id 'java'
	id 'org.springframework.boot' version '3.4.1'
	id 'io.spring.dependency-management' version '1.1.7'
}

group = 'spring'
version = '0.0.1-SNAPSHOT'

java {
	toolchain {
		languageVersion = JavaLanguageVersion.of(17)
	}
}

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
	compileOnly 'org.projectlombok:lombok'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	testRuntimeOnly 'org.junit.platform:junit-platform-launcher'

	//jdbc
	implementation 'org.springframework.boot:spring-boot-starter-jdbc'
	runtimeOnly 'com.mysql:mysql-connector-j'
}

tasks.named('test') {
	useJUnitPlatform()
}

application.properties에 db정보 추가

spring.application.name=mvc
logging.level.spring.mvc.controller=TRACE

# MySQL Database Configuration
spring.datasource.url=jdbc:mysql://woongjin-project.cr7vyj7mlhft.ap-northeast-2.rds.amazonaws.com/project_3
spring.datasource.username=project_3
spring.datasource.password=project_3
#spring.datasource.url=jdbc:mysql://localhost:3306/project_3
#spring.datasource.username=root
#spring.datasource.password=12341234

# HikariCP Configuration
spring.datasource.hikari.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.maximum-pool-size=10
spring.datasource.hikari.pool-name=HikariPool

# Spring SQL 로그 관련
logging.level.org.springframework.jdbc.core=DEBUG
logging.level.org.springframework.jdbc.datasource=DEBUG
logging.level.org.springframework.jdbc.datasource.DataSourceTransactionManager=DEBUG

변경 전 repository

package spring.mvc.repository;

import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Repository;
import spring.mvc.domain.User;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;

@Repository
//@Primary
public class UserRepositoryImpl implements UserRepository{

    private static final ConcurrentHashMap<Long, User> userMap = new ConcurrentHashMap<>();
    private static Long userIndex = 1L;

    public static void init() {
        userMap.clear();
    }

    @Override
    public User save(User user) {
        user.setUserIdx(userIndex++);
        userMap.put(user.getUserIdx(), user);
        return user;
    }

    @Override
    public Optional<User> findByUserIdx(Long userIdx) {
        return Optional.ofNullable(userMap.get(userIdx));
    }

    @Override
    public Optional<User> findByUserId(String userId) {
        return userMap.values().stream().filter(user -> user.getUserId().equals(userId)).findAny();
    }

    @Override
    public List<User> findByUserName(String userName) {
        return userMap.values().stream().filter(user -> user.getUserName().equals(userName)).collect(Collectors.toList());
    }

    @Override
    public List<User> findAll() {
        return new ArrayList<>(userMap.values());
    }

    @Override
    public Optional<User> update(Long userIdx, User updatedUser) {
        if(userMap.containsKey(userIdx)) {
            updatedUser.setUserIdx(userIdx);
            userMap.put(userIdx, updatedUser);
            return Optional.of(updatedUser);
        }
        return Optional.empty();
    }

    @Override
    public boolean delete(Long userIdx) {
        return userMap.remove(userIdx) != null;
    }
}

변경 후 repository

package spring.mvc.repository;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import spring.mvc.domain.User;

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

@Repository
@Primary
public class JdbcUserRepository implements UserRepository {

    private final JdbcTemplate jdbcTemplate;

    @Autowired
    public JdbcUserRepository(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    @Override
    public User save(User user) {
        String sql = "INSERT INTO user (userId, userName) VALUES (?, ?)";
        jdbcTemplate.update(sql, user.getUserId(), user.getUserName());
        return user;
    }

    @Override
    public Optional<User> findByUserIdx(Long userIdx) {
        String sql = "SELECT * FROM user WHERE userIdx = ?";
        return jdbcTemplate.query(sql, rs -> {
            if (rs.next()) {
                User user = new User();
                user.setUserIdx(rs.getLong("userIdx"));
                user.setUserId(rs.getString("userId"));
                user.setUserName(rs.getString("userName"));
                return Optional.of(user);
            }
            return Optional.empty();
        }, userIdx);
    }

    @Override
    public Optional<User> findByUserId(String userId) {
        String sql = "SELECT * FROM user WHERE userId = ?";
        return jdbcTemplate.query(sql, rs -> {
            if (rs.next()) {
                User user = new User();
                user.setUserIdx(rs.getLong("userIdx"));
                user.setUserId(rs.getString("userId"));
                user.setUserName(rs.getString("userName"));
                return Optional.of(user);
            }
            return Optional.empty();
        }, userId);
    }

    @Override
    public List<User> findByUserName(String userName) {
        String sql = "SELECT * FROM user WHERE userName = ?";
        return jdbcTemplate.query(sql, (rs, rowNum) -> {
            User user = new User();
            user.setUserIdx(rs.getLong("userIdx"));
            user.setUserId(rs.getString("userId"));
            user.setUserName(rs.getString("userName"));
            return user;
        }, userName);
    }

    @Override
    public List<User> findAll() {
        String sql = "SELECT * FROM user";
        return jdbcTemplate.query(sql, (rs, rowNum) -> {
            User user = new User();
            user.setUserIdx(rs.getLong("userIdx"));
            user.setUserId(rs.getString("userId"));
            user.setUserName(rs.getString("userName"));
            return user;
        });
    }

    @Override
    public Optional<User> update(Long userIdx, User updatedUser) {
        String sql = "UPDATE user SET userName = ?, email = ? WHERE userIdx = ?";
        int rowsUpdated = jdbcTemplate.update(sql, updatedUser.getUserName(), userIdx);
        return rowsUpdated > 0 ? findByUserIdx(userIdx) : Optional.empty();
    }

    @Override
    public boolean delete(Long userIdx) {
        String sql = "DELETE FROM user WHERE userIdx = ?";
        int rowsDeleted = jdbcTemplate.update(sql, userIdx);
        return rowsDeleted > 0;
    }
}

Previous스프링 MVC 보충자료Next11 Validation(검증)

Last updated 4 months ago