CRUD 실습
1. JDBC 및 DB 세팅
docker - mysql 버전
a) Dependency 추가
→ Maven
<!-- JDBC -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- H2 DB -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<!-- MySQL -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
XML
복사
b) yml 파일 작성
→ application-dev.yml
# h2
spring:
h2:
console:
enabled: true
path: /h2-console
datasource:
url: jdbc:h2:mem:test
username: sa
password:
YAML
복사
•
실제 서버에선 develop 서버, production 서버 등을 구분
•
production 서버의 db 정보, token 값 등 보안상 문제가 되는 yml 파일은 gitignore에 추가
•
로컬에서 H2를 사용하는 develop 관련 yml 파일은 github에 올려도 상관없음 (.env의 역할)
→ application.yml
spring:
mvc:
pathmatch:
matching-strategy: ant_path_matcher
profiles:
include:
- dev
YAML
복사
•
profiles → include → dev
2. 동작 원리 (실습 기준)
3. DTO
// UserDto.java
package com.springboot.hello.domain.dto;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Setter
@Getter
@AllArgsConstructor
public class UserDto {
private String id;
private String name;
private String password;
}
Java
복사
•
계층 간 데이터 교환을 하기 위한 객체
•
getter와 setter만 가짐
•
로직 없음
4. DAO
// UserDao.java
package com.springboot.hello.dao;
import com.springboot.hello.domain.dto.UserDto;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
@Component
public class UserDao {
private final JdbcTemplate jdbcTemplate;
public UserDao(JdbcTemplate jdbcTemplate){
this.jdbcTemplate = jdbcTemplate;
}
public int insert(UserDto user){
return this.jdbcTemplate.update("INSERT INTO users(id, name, password) VALUES (?, ?, ?)",
user.getId(), user.getName(), user.getPassword());
}
public int deleteById(String id){
return this.jdbcTemplate.update("delete from users where id = ?", id);
}
public int deleteAll() {
return this.jdbcTemplate.update("delete from users");
}
}
Java
복사
•
DB의 데이터에 접근하기 위한 객체
•
DB 관련 비즈니스 로직을 분리하기 위해 사용
5. Controller
// UserController.java
package com.springboot.hello.controller;
import com.springboot.hello.dao.UserDao;
import com.springboot.hello.domain.dto.UserDto;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
@AllArgsConstructor
@Slf4j
@RestController
@RequestMapping("/api/v1/user-api")
public class UserController {
private final UserDao userDao;
@PostMapping("/sign-up")
public String add(@RequestBody UserDto user) {
int result = userDao.insert(user);
if(result==1){
return user.getId() + "번에 정보가 등록되었습니다.";
} else {
return "잘못된 양식입니다";
}
}
@DeleteMapping(value = "/user/{id}")
public String deleteById(@PathVariable String id) {
int result = userDao.deleteById(id);
if(result==1){
return id + "번 유저가 삭제되었습니다.";
} else {
return "잘못된 양식입니다";
}
}
@DeleteMapping(value = "/user/all")
public String deleteAll() {
int result = userDao.deleteAll();
if(result==1){
return "모든 유저가 삭제되었습니다.";
} else {
return "오류가 발생했습니다";
}
}
}
Java
복사
•
사용자의 요청을 받고 처리 후 응답
•
실습 코드에서는 각 메서드에 직접 로직을 작성했지만, 원래는 Controller가 아닌 Service에 작성해야 하는 코드
알고리즘 1. 폰켓몬
HashSet
•
이 클래스의 가장 큰 특징은 중복을 허용하지 않는다는 것이다.
중복을 걸러내는 과정
문제 풀이에 필요한 HashSet문법
•
코드 설계 과정
1.
중복 제거를 할 수 있는지?
2.
N을 구하는 식을 짤 수 있는지?
1. 개수의 절반의 크기를 미리 int N 변수에 저장
2. 배열의 index 0부터 nums.length-1 까지 차례로 Hashset에 add 하고 나면 중복이 제거된 값만 set에 저장됨.
3. if(N > Hashset.size()) answer = N
4. else answer = Hashset
Plain Text
복사
public static int solution(int[] nums) {
HashSet<Integer> set = new HashSet<>();
int answer = 0;
int N = nums.length / 2;
for(int i = 0; i<nums.length; i++){
set.add(nums[i]);
}
// 중복제거된 값 확인
// System.out.println(set.toString());
if(set.size() < N){
answer = set.size();
}else {
answer = N;
}
return answer;
}
Java
복사