Today I Learned

2024 스파르타 내일배움캠프 Sping 트랙 참여 // day34

shinelee26 2024. 11. 18. 21:07

오늘 진행한 학습 요약

1. 베이직반 강의 ( 2회차 - Spring Controller )

  • Spring Boot의 설정
  • RESTful API 설계
  • @PathVariable, @RequestParam, @ModelAttribute, @RequestBody

2. 베이직반 강의 ( 3회차 - 데이터베이스  )

  • 데이터베이스 정규화와 Spring JDBC 기초
    • 1정규화 (1NF): 데이터의 원자성 유지하기
    • 2정규화 (2NF): 부분적 종속성 제거하기
    • 3정규화 (3NF): 이행적 종속성 제거하기
    • BCNF (Boyce-Codd Normal Form): 추가적인 중복성 제거
    • 4정규화 (4NF): 다치 종속성 제거하기
    • 5정규화 (5NF): 조합적 종속성 제거하기
    • 정규화 요약과 실전에서의 적용
  • SQL 기초와 JOIN
    • SQL 소개와 기본 개념
    • 데이터 정의 언어(DDL)
    • 데이터 조작 언어(DML)
    • JOIN의 이해와 종류
    • Spring JDBC를 활용한 SQL과 JOIN

2. 알고리즘 코드카다  Day32~34(작성 생략)

CodingTest Git-hub 링크 : https://github.com/chews26/CodingTest

 


학습 정리

1. 베이직반 강의 ( 2회차 - Spring Controller )

  • Spring Boot의 설정
    • build.gradle 파일은 Gradle 빌드 도구를 사용하는 프로젝트에서 매우 중요한 역할
    • Gradle은 자바, 코틀린 등을 비롯한 여러 언어의 프로젝트를 위한 오픈소스 빌드 자동화 시스템
    • build.gradle의 구조와 역할
      • 프로젝트 설정 (Project Configuration)
      • 의존성 관리 (Dependencies Management)
      • 플러그인 (Plugins)
      • 태스크 설정 (Task Configuration)
      • 빌드 설정 (Build Configuration)
  • RESTful API 설계
    • REST(Representational State Transfer)는 웹 표준을 기반으로 하는 API 설계 아키텍처
    • RESTful API는 네트워크 상에서 클라이언트와 서버 간의 통신을 위해 자원(Resource)의 상태를 전달하는 방법을 정의
    • 클라이언트가 서버의 자원에 접근하고 이를 활용할 수 있도록 하는 역할
    • 자원 중심의 URI 설계
      • 각 자원은 명확한 URI로 식별되어야 함
      • 자원은 동사가 아닌 명사를 사용
    • HTTP 메서드를 통한 행위 정의
      • GET: 자원을 조회
      • POST: 새로운 자원을 생성
      • PUT: 자원을 업데이트
      • DELETE: 자원을 삭제
    • 데이터 포맷
      • JSON(JavaScript Object Notation) 형식을 통해 데이터를 교환하는 것이 트렌드
      • XML보다 가볍고, 인간이 읽기 쉬움
JSON
{
  "판매자정보": {
    "이름": "남도일",
    "지역": "서울"
  },
  "판매품목": [
    "사과",
    "배",
    "딸기"
  ]
}
  • @PathVariable, @RequestParam, @ModelAttribute, @RequestBody
    • @PathVariable
      • @PathVariable은 URL 경로에 포함된 변수를 컨트롤러 메서드의 매개변수로 바인딩하는 데 사용
      • URL 경로의 일부를 변수로 사용하여, 동적으로 변하는 URL 경로를 처리
      • 간결하고 직관적인 API 경로를 설계
    • @RequestParam
      • @RequestParam은 클라이언트가 전송하는 HTTP 요청 파라미터를 컨트롤러 메서드의 매개변수로 바인딩하는 데 사용
      • URL에서 지정된 이름의 파라미터를 메서드 매개변수로 전달
      • 필수 여부, 기본값 설정 등의 추가적인 설정이 가능
    • @ModelAttribute
      • @ModelAttribute는 요청 파라미터를 객체로 매핑하여, 복잡한 데이터 구조를 쉽게 다루게 해줌
      • 폼 데이터의 각 필드가 객체의 필드와 자동으로 매핑
      • 복잡한 객체 구조의 데이터를 간편하게 처리
    • @RequestBody
      • @RequestBody는 클라이언트가 전송하는 HTTP 요청의 본문(body)을 Java 객체로 변환하여 받음
      • HTTP 요청 본문의 내용을 자바 객체로 역직렬화
      • 주로 JSON형식의 데이터 처리에 사용

 


1. 베이직반 강의 ( 3회차 - 데이터베이스  )

 

데이터베이스 정규화와 Spring JDBC 기초

  • 데이터베이스란 데이터를 체계적으로 저장하고 관리하는 시스템
  • DBMS(Database Management System)는 이러한 데이터베이스를 관리하는 소프트웨어
  • 정규화(Normalization)는 데이터의 중복을 최소화하고 일관성을 유지하기 위한 데이터베이스 설계 기법
  • 이상 현상(Anomalies)을 방지하여 데이터의 무결성을 확보(삽입 이상, 삭제 이상, 갱신 이상)
  • Spring JDBC는 Java 애플리케이션에서 데이터베이스 작업을 쉽게 할 수 있도록 도와주는 라이브러리
    SQL 쿼리를 실행하고 결과를 매핑하여 객체로 변환하는 과정을 단순화
      
    • 1정규화 (1NF): 데이터의 원자성 유지하기
      • 원자성(Atomicity): 하나의 칸(셀)에 하나의 값만 저장
      • 1정규화는 모든 테이블의 필드가 원자값을 가지도록 보장
    • 2정규화 (2NF): 부분적 종속성 제거하기
      • 부분적 종속성 제거: 기본 키의 일부가 아닌 전체에 종속되도록 함
      • 복합 키를 사용하는 테이블에서 발생
    • 3정규화 (3NF): 이행적 종속성 제거하기
      • 이행적 종속성 제거: 기본 키가 아닌 컬럼이 다른 기본 키가 아닌 컬럼을 결정하지 않도록 함
      • 기본 키 → A → B 형태의 종속성을 제거
    • BCNF (Boyce-Codd Normal Form): 추가적인 중복성 제거
      • BCNF보이스-코드 정규형으로, 3정규화보다 더 엄격한 형태
      • 모든 결정자가 후보 키가 되도록 설계
      • 결정자: (코스, 강사) → 시간, 하지만 강사만으로도 시간을 결정할 수 있습니다.
    • 4정규화 (4NF): 다치 종속성 제거하기
      • 다치 종속성 제거: 하나의 테이블에 여러 개의 다치 종속성이 존재할 때 이를 분리
      • 다치 종속성: 한 키에 대해 여러 값이 독립적으로 존재하는 경우
    • 5정규화 (5NF): 조합적 종속성 제거하기
      • 조합적 종속성 제거: 테이블을 가능한 한 분해하여 데이터 중복을 최소화
      • 모든 조합 가능한 종속성을 고려하여 분해
    • 정규화 요약과 실전에서의 적용
      • 1정규화: 모든 필드는 원자값을 가져야 합니다.
      • 2정규화: 부분적 종속성을 제거합니다.
      • 3정규화: 이행적 종속성을 제거합니다.
      • BCNF: 모든 결정자가 후보 키가 되도록 합니다.
      • 4정규화: 다치 종속성을 제거합니다.
      • 5정규화: 조합적 종속성을 제거합니다.
      • 성능 향상을 위해 비정규화(Denormalization)를 적용하기도 함
        • JOIN 연산의 감소로 인한 조회 속도 향상
        • 데이터 중복을 허용하여 캐싱 효율성 증가

 

SQL 기초와 JOIN

  • SQL 소개와 기본 개념
    • SQL(Structured Query Language)은 관계형 데이터베이스 관리 시스템(RDBMS)에서 데이터를 관리하고 조작하기 위한 표준 프로그래밍 언어
    • 데이터 정의, 데이터 조작, 데이터 제어 등을 수행할 수 있음
    • 관계형 데이터베이스
      • 데이터를 테이블(Table) 형태로 저장하며, 테이블 간의 관계를 정의
      • 엑셀 시트와 비슷한 형태로 데이터를 저장하지만, 더 구조화되고 관계를 정의
    • RDBMS 종류
      • MySQL, PostgreSQL, Oracle, SQL Server
  • 데이터 정의 언어(DDL)
    • 데이터베이스의 구조를 정의하거나 변경할 때 사용하는 언어
    • 주요 명령어: CREATE, ALTER, DROP
  • 데이터 조작 언어(DML)
    • 데이터베이스에 저장된 데이터를 조작할 때 사용하는 언어
    • 주요 명령어: SELECT, INSERT, UPDATE, DELETE
  • JOIN의 이해와 종류
    • 두 개 이상의 테이블을 연결하여 데이터를 조회하는 방법
    • 관계형 데이터베이스의 핵심 기능 중 하나
    • INNER JOIN
      • 두 테이블에서 공통된 값이 있는 행만 반환
    • LEFT JOIN (LEFT OUTER JOIN)
      • 왼쪽 테이블의 모든 행과 오른쪽 테이블에서 매칭되는 행을 반환
      • 매칭되지 않는 경우 NULL로 표시
    • RIGHT JOIN (RIGHT OUTER JOIN)
      • 오른쪽 테이블의 모든 행과 왼쪽 테이블에서 매칭되는 행을 반환
    • FULL OUTER JOIN
      • 양쪽 테이블의 모든 행을 반환하며, 매칭되지 않는 경우 NULL로 표시
      • MySQL에서는 직접 지원하지 않으므로 UNION을 사용하여 구현
  • Spring JDBC를 활용한 SQL과 JOIN
    • Spring Framework에서 제공하는 JDBC 지원 라이브러리로, 데이터베이스 연동을 간편하게 해줌
    • JdbcTemplate 클래스를 사용하여 SQL 쿼리를 실행하고 결과를 처리
    • 의존성 추가 (build.gradle)
    • 데이터베이스 연결 설정 (application.properties)
    • 데이터 조회 예제
      • @Repository
        public class StudentDao {
        
            @Autowired
            private JdbcTemplate jdbcTemplate;
        
            public List<Student> getAllStudents() {
                String sql = "SELECT * FROM students";
                return jdbcTemplate.query(sql, new RowMapper<Student>() {
                    @Override
                    public Student mapRow(ResultSet rs, int rowNum) throws SQLException {
                        Student student = new Student();
                        student.setStudentId(rs.getInt("student_id"));
                        student.setName(rs.getString("name"));
                        student.setMajor(rs.getString("major"));
                        return student;
                    }
                });
            }
        }
    • 데이터 삽입 예제
      • public int addStudent(Student student) {
            String sql = "INSERT INTO students (student_id, name, major) VALUES (?, ?, ?)";
            return jdbcTemplate.update(sql, student.getStudentId(), student.getName(), student.getMajor());
        }

    • 데이터 수정 예제
      • public int updateStudentMajor(int studentId, String newMajor) {
            String sql = "UPDATE students SET major = ? WHERE student_id = ?";
            return jdbcTemplate.update(sql, newMajor, studentId);
        }

    • 데이터 삭제 예제
      • public int deleteStudent(int studentId) {
            String sql = "DELETE FROM students WHERE student_id = ?";
            return jdbcTemplate.update(sql, studentId);
        }