블로그
전체 6#태그
- 트랜잭션
- 워밍업
- JAVA
- SpringBoot
2024. 03. 04.
0
cascade 옵션, orphanRemoval 옵션
✏ (강의 링크 - https://inf.run/XKQg)cascade 옵션 이란?한 객체가 저장되거나 삭제될 때, 그 변경이 폭포처럼 흘러연결되어 있는 객체도 함께 저장되거나 삭제되는 기능유저와 빌린 책 1, 2유저를 삭제하면 DB에서는 어떤 데이터가 삭제될까?=> 유저만 사라짐 유저는 사라졌지만 기록은 남아있는 경우가 있어서 기록까지 다 삭제시키는 것이 cascade 옵션@OneToMany(mappedBy = "user", cascade = CascadeType.ALL) private List userLoanHistories = new ArrayList(); orphanRemoval 옵션유저와 유저가 빌린책 1, 2중 1만 관계를 끊어내어 DB에서 지우고 싶을 때@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true) private List userLoanHistories = new ArrayList();=> 객체간의 관계가 끊어진 데이터를 자동으로 제거하는 옵션관계가 끊어진 데이터 = orphan (고아)제가 = removal
2024. 03. 04.
0
[워밍업 스터디 클럽 0기 BE] 트랜잭션 이란?
✏️ (강의 링크 - https://inf.run/XKQg) 트랜잭션 이란?쪼갤 수 없는 업무의 최소 단위모든 SQL을 성공시키거나, 중간에 하나라도 실패하면 모두 실패시킴=> 즉 한 번에 성공시키거나 한 번에 실패시킨다.트랜잭션 시작하기start transaction;트랜잭션 정상 종료하기commit;트랜잭션 실패 처리(SQL 미반영)rollback; Spring에서 트랜잭션 적용하기@TransactionalSELECT 쿼리만 사용한다면, readOnly 옵션을 쓸 수 있다@Transactional(readOnly - true)IOException과 같은 Checked Exception은 롤백이 일어나지 않는다. 영속성 컨텍스트 란?테이블과 매핑된 Entity 객체를 관리/보관하는 역할스프링에서는 트랜잭션을 사용하면 영속성 컨텍스트가 생겨나고,트랜잭션이 종료되면 영속성 컨텍스트가 종료된다.영속성 컨텍스트의 특수 능력 4가지- 변경 감지 (Dirty Check): 영속성 컨텍스트 안에서 불러와진 Entity는 명시적으로 save하지 않더라도, 변경을 감지해 자동으로 저장된다.- 쓰기 지연: DB의 INSERT / UPDATE / DELETE SQL을 바로 날리는 것이 아니라,트랜잭션이 commit될 때 모아서 한 번만 날린다.- 1차 캐싱: ID를 기준으로 Entity를 기억User user1 = userRepository.findById(1L).get();ID가 1인 유저 조회 -> 영속성 컨텍스트가 1인 유저를 기억 - 지연 로딩: 꼭 필요한 순간에 데이터를 로딩한다. @Transactional public void returnBook(BookReturnRequest request) { User user = userRepository.findByName(request.getUserName()) .orElseThrow(IllegalArgumentException::new); System.out.println("Hello"); user.returnBook(request.getBookName()); }
트랜잭션
2024. 03. 04.
0
[워밍업 스터디 클럽 0기 BE] 4강 정리 및 공부
(강의 링크 - https://inf.run/XKQg)최초 JPA 사용하기문자열 SQL을 직접 사용하는 것의 한계를 이해하고, 해결책인 JPA, Hibernate, Spring Data JPA가 무엇인지 이해한다.Spring Data JPA를 이용해 데이터를 생성, 조회, 수정, 삭제할 수 있다.트랜잭션이 왜 필요한지 이해하고, 스프릉에서 제어하는 방법을 익힌다.영속성 컨텍스트와 트랜잭션 관계를 이해하고, 영속성 컨텍스트의 특징을 알아본다.JPA(Java Persistence API): 자바 진영의 ORM (Object-Relational Mapping)* Persistence 영속성 : 서버가 재시작되어도 데이터는 영구적으로 저장되는 속성=> 객체와 관계형 DB의 테이블을 짝지 데이터를 영구적으로 보관하기 위해 Java 진영에서 정해진 규칙 -> HIBERNATE JPA 어노테이션JPA를 사용하기 위해서는 기본 생성자가 꼭 필요하다.@ColumnColumn 어노테이션 자체를 생략할 수 있다. 완전히 동일하는 경우 application.ymlddl-auto: -> 스프링이 시작할 때 DB에 있는 테이블을 어떻게 처리할지: create -> 기존 테이블이 있다면 삭제 후 다시 생성: create-drop -> 종료될 때 테이블 모두 제거: update -> 객체와 테이블이 다른 부분만 변경: validate -> 객체와 테이블이 동일한지 확인: none -> 별다른 조치를 하지 않는다. show_sql -> JPA를 사용해 DB에 SQL을 날릴 때 SQL을 보여줄 것인가format_sql -> SQL을 보여줄 때 예쁘게 포맷팅 할 것인가dialect -> 이 옵션으로 DB를 특정하면 조금씩 다른 SQL을 수정해준다. 유저 저장 기능save 메소드에 객체를 넣어주면 INSERT SQL이 자동 / save 되고 난 후 id가 들어가있다. save : 주어지는 객체를 저장하거나 업데이트 시켜준다.findAll : 주어지는 객체가 매핑된 테이블의 모든 데이터를 가져온다.findById : id를 기준으로 특정한 1개의 데이터를 가져온다.
2024. 02. 21.
0
[워밍업 스터디 클럽 0기 BE] 3강 정리 및 공부
✏ ️강의 링크 - https://inf.run/XKQg 역할의 분리와 스프링 컨테이너Clean Code는 왜 중요한가? : 코드는 요구사항을 표현하는 언어이다. : 클래스는 작아야 하며 하나의 책임만을 가져야 한다. : 함수는 최대한 작게 만들고 한 가지 일만 수행하는 것이 좋다. Controller의 함수 역할API의 진입 지점으로써 HTTP Body를 객체로 변환하고 있다.현재 유저가 있는지, 없는지 등을 확인하고 예외 처리 해준다. --> service로 분리SQL을 사용해 실제 DB와의 통신을 담당한다. --> repository로 분리즉 , Controller의 역할을 3가지로 분리 = > Layered Architecture UserController와 스프링 컨테이너: static이 아닌 코드를 사용하려면 인스턴스화가 필요하다.Controller는 인스턴스를 어떻게하고있는가=> @RestController 어노테이션UserController 클래스를 스프링 빈으로 등록시킨다.: UserController는 JdbcTemplate이 필요하다.=> 즉, JdbcTemplate에 의존하고 있다. (JdbcTemplate이 없으면 동작하지 않는다) 스프링 빈이란?: 스프링 부트 서버가 시작되면, 스프링 서버 내부에 건대한 컨테이너를 만들게 된다.컨터이너 안에는 여러 클래스가 들어가게 된다. 들어간 클래스를 스프링 빈 이라고 한다.JdbcTemplate도 이미 스프링 빈 안에 들어가있다.다양한 정보와 함께 인스턴스화도 이루어진다. => (타입 : UserController , 이름 : userController) JdbcTemplate은 우리가 가져온 Dependency가 등록해주고 있다.(build.gradle - dependencies) 서버 시작 시1) 스프링 컨테이너(클래스 저장소)가 시작2) 기본적으로 많은 스프링 빈들이 등록3) 우리가 설정해준 스프링 빈이 등록4) 필요한 의존성이 자동으로 설정 but, UserRepository는 JdbcTemplate을 가져오지 못하는 가=> JdbcTemplate을 가져오려면 UserRepository가 스프링 빈이 아니라 그냥 클래스이기 때문@Repository / @Service Repostitory를 다른 Class로 변경해도 Service를 변경하지 않는 방법=> interface를 활용코드를 단 한 줄도 바꾸지 않고 요구 사항을 변경할 수 있을까=> 스프링 컨테이너: 컨테이너가 선택해 BookService에 넣어주는 과정을 의존성 주입(DI, Dependency Injection)라고 한다.이런 방식을 제어의 역전(Ioc) 이라고 한다.@Repository 가 두개면 @Primary를 사용할 곳에 붙여주면된다.@Primary : 우선권을 결정하는 어노테이션 빈을 등록하는 방법@Configurartion: 클래스에 붙이는 어노테이션: @Bean을 사용할 때 함께 사용해 주어야 한다.@Bean: 메소드에 붙이는 어노테이션: 메소드에서 반환되는 객체를 스프링 빈에 등록한다. 언제 @Service, @Repository를 사용해야 할까?: 개발자가 직접 만든 클래스를 스프링 빈으로 등록할 때! 언제 @Configuration + @Bean을 사용해야 할까?: 외부 라이브러리, 프레임워크에ㅓㅅ 만든 클래스를 등록할 때! @Component: 주어진 클래스를 '컴포넌트'로 간주한다.: 이 클래스들은 스프링 서버가 뜰 때 자동으로 감지된다. @RestController , @Service 등 안에 @Component 가 포함되 있어서 어노테이션이 자동 감지 스프링 빈을 주입 받는 몇 가지 방법(가장 권장) 생성자를 이용해 주입받는 방식 (@Autowired 생략 가능)setter 와 @Autowired 사용 : 누군가 setter를 사용하면 오작동할 수 있다.필드에 직접 @Autowired 사용 : 테스트를 어렵게 만드는 요인이다. @Qualifier란?여러가지 @Service 에서 가장 우선이 되게한다.@Qualifier vs @Primary: 사용하는 쪽에서 직접 적어준 @Qualifier가 이긴다 따로 "main"이라고 선언하면 main으로 사용가능. 안할 시 "bananaService"라고 적어도 된다.
2024. 02. 21.
0
[워밍업 스터디 클럽 0기 BE] 2강 정리 및 공부
✏ ️강의 링크 - https://inf.run/XKQg 디스크와 메모리의 차이를 이해하고, Database의 필요성 이해SQL 조작스프링 부트 서버를 이용해 Database접근, 저장, 조회, 업데이트, 삭제API 예외 상황을 알아보고 예외 처리 Database: 데이터를 구조화 시켜 저장RDB (Relational Database) - MySQL: 데이터를 표처럼 구조화 시켜 저장SQL (Structured Query Language): 표처럼 구조화된 데이터를 조회하는 언어 create database [이름]; - database 생성show databases; - database 조회drop database [이름]; - database 삭제use [데이터베이스 이름]; - 데이터베이스 사용show tables; - 데이터베이스 안 테이블 조회create table [이름] ([필드1][타입][부가조건],[필드2][타입][부가조건],...primary key([필드이름])drop table [이름] - 테이블 삭제insert into[테이블이름](필드,필드)values(값,값); - 테이블 추가select * from [테이블이름] - 테이블 전체 조회 ( * 대신 조회하고싶은[필드] 넣어도 됨 )select * from [테이블이름] where [조건] - 조건에 맞는 데이터 조회 ( 조건은 AND 나 OR로 이어 붙일 수 있음 )조건에는 =, , >=, between, in, not in 등이 있다.update [테이블 이름] set 필드=값, where 조건; (조건을 붙이지 않으면 모든 값이 변경이 된다.)delete from [테이블이름] where [조건]; tinyint: 1바이트int: 4바이트bigint: 8바이트 (id경우 21억건을 넘을 수 있으니 bigint를 사용한다) double: 8바이트decimal(A,B): 소수점음 B개 가지고 있는 전체 A자릿수 실수 char(A): A 글자가 들어갈 수 있는 문자열varchar(A): 최대 A글자가 들어갈 수 있는 문자열 date: 날짜, yyyy-MM-ddtime: 시간, HH:mm:ssdatetime: 날짜와 시간을 합친 타입️ application.ymlspring: datasource: url: "jdbc:mysql://localhost/library" username: "root" password: "" driver-class-name: com.mysql.cj.jdbc.Driver jdbc:mysql:// -jdbc(java database connector)를 이용해 mysql에 접근한다!localhost - 접근하려는 mysql이 localhost 에 있다.library - 접근하려는 데이터베이스driver-class-name - 데이터베이스에 접근 할 때 사용할 프로그램 (mysql쓸 때 사용)application 생성 후 유저 변경
2024. 02. 20.
0
[워밍업 스터디 클럽 0기 BE] 1강 정리 및 공부
✏ ️강의 링크 - https://inf.run/XKQg 스프링 프로젝트 설정 시작 및 실행서버란 ? 네트워크와 HTTP, API란 ? JSON ? 서버 개발에 필요한 다양한 개념 이해스프링 부트를 이용해 GET API, POST API 만들기 스프링 프로젝트 설정 시작 및 실행: https://start.spring.io- Project : 빌드 툴 Gradle, Maven- Language : 사용하는 언어- Spring Boot : 버전- Packaging : Jar, War ( 부트는 톰캣 - Jar)- Java : 의 버전! Dependencies ( 의존성 설정 )라이브러리란 ?: 프로그래밍을 개발할 때 미리 만들어져 있는 기능을 가져다 사용하는 것프레임워크란 ?: 프로그래밍을 개발할 때 미리 만들어져 있는 구조에 코드를 가져다 끼워 넣는 것서버(Server)란 ?: 어떠한 기능을 제공하는 프로그램, 실행시키고 있는 컴퓨터 ( ex: 회원가입 기능, 추천 기능 )but 기능 제공을 위해서는 누군가의 요청이 필요, 서버 요청은 인터넷을 통해 함네트워크란 ?IP, portIP를 외우기 어려운 숫자 대신 Domain Name 등장Domain Name System (DNS)- IP 244.66.51.9 = 도메인 이름 spring.com HTTP, API란?: HTTP (HyperText Transfer Protocol)Protocol : 표준, 약속지켜야할 규칙GET /portion?color=red/portion : Path? : QueryHTTP Method ( 요청을 받는 컴퓨터에게 요청하는 행위 )GET 제공 Query(ket & value)POST 저장 BodyPUT 수정 BodyDELETE 삭제 QueryHost: spring.com:3000 URL (Uniform Resource Locator): 주소창 http://spring.com:3000/portion?color=red Post에는 @RequestBody를 사용 Response 부분에서 User user 적용하면users.get 으로 간편하게 users.get으로 선언가능 따로 name과 age 각각 쓰지않아도됨
워밍업
・
JAVA
・
SpringBoot