Logback + CURD통한 DB연동 및 데이터 호출

배지원·2022년 11월 1일
0

SpringBoot

목록 보기
3/11

1. 로깅(Logging)

  • 애플리케이션이 동작하는 동안 시스템의 상태동작 정보시간순으로 기록하는 것
  • 비기능 요구사항 → 사용자나 고객에게는 불필요한 기능
  • 디버깅하거나 개발 이후 발생한 문제를 해결할 때 원인을 분석하는 요소

(1) 로깅 라이브러리 - Logback

  • log4j 이후 출시 된 로깅 프레임워크 중 하나로 slf4j를 기반으로 구현
  • 크게 5개의 로그 레벨을 설정할 수 있음(가장 많이 사용 되는 것은 INFO)
    -> 로그 레벨을 구분하는 이유는? 기록이 너무 많이 남으면 보기가 힘들기 때문에 상황에 따라 필요한 로그레벨을 사용하여 로그를 확인한다.

5개의 로그 레벨이 있다.

TRACE : DEBUG 레벨보다 더 상세한 메세지를 표현하기 위한 레벨

DEBUG : 애플리케이션의 디버깅을 위한 메세지를 표시하는 레벨

INFO : 애플리케이션의 상태 변경과 같은 정보 전달을 위해 사용

WARN : 시스템 에러의 원인이 될 수 있는 경고 레벨을 의미

ERROR : 로직 수행 중에 시스템에 심각한 문제가 발생해서 애플리케이션의 작동이 불가능한 경우

TRACEDEBUGINFOWARNERROR
다 나옴조금 덜 나옴덜 나옴조금 나옴에러만 나옴

Spring Boot의 기본은 로그 레벨은 INFO 레벨이다.

로그레벨 바꾸는 법

  • application.yml에서 설정해줌
logging:
  level:
    root: DEBUG

DEBUG로 레벨을 바꿨기 때문에 DEBUG레벨 이하의 내용이 전부 나온다.
로그를 많이 남기면 서버에 용량이 금방 차서 문제가 발생하기 때문에 Rolling - limit를 정해두고 오래된 로그부터 지운다.

(2) 로그 남기는 법

  • Controller의 클래스 명 위@Slf4j 어노테이션을 달아줌
  • 각 Mapping 안에 log.info(”원하는 로그 내용”); 입력
    • url에 값을 받아오는 GetMapping 인 경우
      log.info(”원하는 로그 내용. varialbe:{}”, varialbe); 로 입력 가능
@RestController
@RequestMapping("/api/v1/get-api")
@Slf4j
public class GetController {
    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    public String hello() {
        log.info("hello로 요청이 들어왔습니다.");
        return "Hello World";
    }

    @GetMapping(value = "/name")
    public String getName(){
        log.info("getName으로 요청이 들어왔습니다.");
        return "Flature";
    }
}
이처럼 프로그램이 잘 동작하고 있는지 확인용으로도 Log를 통해 확인할 수 있다.

2. ORM : 객체 관계 매핑

  • 자바 오브젝트(Class)와 관계형 데이터베이스(RDB)의 테이블과 매핑해주는 기능
  • 자바와 DB 테이블은 매핑을 할때 어쩔수 없는 불일치가 존재함 따라서 이런 불일치와 제약사항을 해결하기 위한 역할을 하는것이 ORM이다.
  • 쿼리문을 작성하지 않고 코드로 데이터를 조작할 수 있다.(쿼리문은 JPA가 작성해줌)

ORM의 장점

  • 데이터베이스 쿼리를 객체지향적으로 조작 가능
  • 재사용 및 유지보수 편리
  • 데이터베이스에 대한 종속성이 줄어든다

ORM의 단점

  • 복잡한 쿼리 구현 어려움
  • 단독사용 어려움
  • 초보자가 사용하기에 매우 위험(데이터를 전부 날릴수 있음)

3. CURD API 구현하기

Layer 구조

ClientDELETE /user
Controller@Autowired
UserDao userDao.deleteAll()
Business(Service)생략
Data Access(DAO)this.jdbcTemplate.update(“delete from users”);

설계

(1) Dependency 추가

Pom.xml

	<dependency>
    	<groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.30</version>
   </dependency>
  • spring-boot-starter-jdbc 추가
  • mysql-connector-java 추가

(2) DB연동

application.yml

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql:://localhost:3306/likelion-db
    username: root
    password: 12345678
  • default로 local DB에 연결하고 Spring Jdbc에 주입한다.
  • IntelliJ 환경변수에 SPRING_DATASOURCE_URL=jdbc:mysql://:3306/likelion-db 로 덮어쓰기 할 수 있다.

CODE

UserDTO

@AllArgsConstructor
@Getter
// 위 두가지 어노테이션 사용 시 constructor, getter 생성 안해도됨
public class User {
    private String id;
    private String name;
    private String password;
}

UserDaoController

@RestController
@RequestMapping("/api/v1/user")
public class UserDaoController {

    private final UserDao userDao;

    public UserDaoController(UserDao userDao) {
        this.userDao = userDao;
    }

    @PostMapping("")
    public ResponseEntity<Integer> add(@RequestBody UserRequestDto userRequestDto) {
        User user = new User(userRequestDto.getId(),
															userRequestDto.getName(),
															userRequestDto.getPassword());
        return ResponseEntity
                .ok()
                .body(userDao.add(user));
    }

    @DeleteMapping("")
    public ResponseEntity<Integer> deleteAll(){
        return ResponseEntity
                .ok()
                .body(userDao.deleteAll());

    }
}

UserDao

@Component // UserDao를 사용한다고 등록
public class UserDao {
    private final DataSource dataSource;
    private final JdbcTemplate jdbcTemplate;

    public UserDao(DataSource dataSource) {
        this.dataSource = dataSource;
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }
		public int add(User user) {
		    return this.jdbcTemplate.update("INSERT INTO users(id, name, password) VALUES(?, ?, ?)", user.getId(), user.getName(), user.getPassword());
}

		public int deleteAll()
		    return this.jdbcTemplate.update("delete from users");
}

SwaggerConfiguration

@Component // UserDao파일을 bean으로 사용한다고 등록
public class UserDao {
    private final DataSource dataSource;
    private final JdbcTemplate jdbcTemplate;

    public UserDao(DataSource dataSource) {
        this.dataSource = dataSource;
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }
		public int add(User user) {
		    return this.jdbcTemplate.update("INSERT INTO users(id, name, password) VALUES(?, ?, ?)", user.getId(), user.getName(), user.getPassword());
}

		public int deleteAll()
		    return this.jdbcTemplate.update("delete from users");
}
profile
Web Developer

0개의 댓글