데브코스 24일차 TIL

Heesu Song·2025년 4월 4일

데브코스 - 백엔드

목록 보기
20/32
post-thumbnail

매우 부끄러운 하루였다..

복습

고차 함수

function fn (f1, params) {
    return f1(params)
}
--------------------
fn(n => n * n, 11)
--------------------
==>121

JS도 GC가 존재해서 사용하지 않는 메모리는 알아서 해제해준다.

function createCounter() {
    let count = 0;  // count는 createCounter 내부 클로저로 유지됨
    return function () {
        count += 1;  
        return count;
    };
}

const counter = createCounter();

console.log(counter()); // 1
console.log(counter()); // 2

→ 이 경우엔 GC가 변수와 함수를 해제하지 못한다. (메모리 누수 발생)

_ 를 붙이고 변수를 만들면 private 접근자

fetchAPI 실습


갱신을 눌렀을 때는 이미 스프링에서는 벗어났기 때문에 JS를 통해 바꿔줘야한다
→ 그래서 비동기 통신이 필요함

fetch ('http://localhost:8080/ticket')
        .then (resp => {return resp.json();})
        .then( data => {
            console.log("DATA!")
            console.log(data)
        })
        .catch ( err => console.log(err));
  • 첫번째 then의 resp에서 받아온 값을 두번째 then의 data에 넣어줌

JS 로 input태그 가져오기

js는 HTML을 트리구조로 보기 때문에 DOM 형태로 가져올 수 있음

*document*.getElementById();

→ 노드를 가져온다.

→가지고 오고 싶은 요소의 id를 넣어주면 됨

fetch ('http://localhost:8080/ticket')
        .then (resp => {return resp.json();})
        .then( data => {
            console.log(data.name)
            document.getElementById('ticket-name').value = data.name;
        })
        .catch ();
  • 갱신하는 시점에 태그를 불러와야 가능
  • JS 는 ‘’와 “”를 똑같이 문자열로 봄
  • document.getElementById('ticket-name').value 의 value는 <input value=""> 를 가져오는것임

fetchAPI로 Spring CRUD 실습


method: "POST",
headers: {
		"Content-Type": "application/json"
},
body: JSON.stringify(data)
  • option에 method를 POST로 두면
  • java에서는 다른 언어의 객체를 어떻게 처리하는지를 모름
    • 객체를 알아차릴 수 있는 단위로 바꿔줘서 보내줘야함 stringify

get에서 postid를 알 수 없는 문제

로컬 스토리지: 브라우저에만 저장되는 저장소 → devtools에서 확인 가능

  • *window*.localStorage.setItem(*SEQUENCE_KEY*, 0); 를 통해 값을 겨져옴

유효성 검사

꼼수(?)

unction validate() {
    if (getSequence() === 0) {
        alert('게시글을 먼저 작성해주시기 바랍니다.');
        return false;
    }
    return true;
  • SEQUENCE_KEY 값을 가져와서 0이면 빠꾸
if( !validate() ){
        return;
    }

Test 오류

혼자 테스트할 때 content값이 안들어가는 문제가 계속 있었는데
코드에서 어디는 content라고 쓰고 어디는 contents라고 써서 그런거였다

→ 성공!

DELETE 반환 값 문제

Spring Data JPA

JDBC


Java 애플리케이션에서 DB에 접근하기 위한 인터페이스를 표준화해서 제공(명세)

Driver가 커넥션이 되어 연결

→ 쿼리가 가능

SQL 중심으로 개발 됐을 때 생기는 의존 문제

DB는 언제나 변경될 수 있는데 Java애플리케이션이 SQL 의존적이면, 엔티티가 변경되었을 때 전체 애플리케이션에 큰 문제가 생길 수 있음 (신뢰 불가능)

모델링이 → 스키마를 따라가게 된다 → 상속, 다형성 등 객체지향의 장점

ORM


위와같은 문제를 해결하기 위해 생겨난 기술

  • DB의 릴레이셔널과 애플리케이션 객체간의 불일치를 해소하기 위한 프로그래밍 기법
    • Spring에서는 JPA
  • ORM에 너무 집중해서 객체쪽에만 편향되게 구성한다면 성능이 매우 떨어질 수 있다.

JPA


SPring은 Java Persistence API 표준으로 ORM을 제공한다.

  • Java에서 ORM 기술에 대한 API 명세
  • 인터페이스로 제공 → 다른 JPA 프레임워크로 전환이 쉬워진다. (다형성)
  • 객체랑 테이블간의 매핑 대신 수행
  • 테이블에 대한 명세를 객체가 가지고 있기 때문에 DDL까지 대신 생성
  • DB와의 상호작용을 추상화 → 접근 방법을 단순화

❗️운영에서 스키마는 직접 짜는게 좋다.

JPA 에서는 각 제품마다 쿼리가 다른 문제도 해결

표준 SQL을 두고 각 DB의 SQL 문법을 방언으로 취급

어떤 DB를 사용하는지 등록하면 그 DB에 맞게 SQL을 대신 만들어준다.

Hibernate


JPA를 구현한 구현체

  • 사용할 DB의 커넥터 Driver를 같이 주입받아야된다.
  • 내부적으로 특정 디렉터리(META_INF)에 xml 설정파일(persistence.xml)을 두고 값을 찾아서 객체를 생성 → SpringBoot는 필요 ❌

XML
컴퓨터 시스템간 정보교환을 위해 만들어놓은 마크업 언어

persistence.xml

영속성 단위에는 DB 접속 정보를 준다.

  • properties - 필수 속성
    • 커넥터 드라이버에 대한 정보 작성
    • 키, 값으로 구성
    • user: jdbc에 접근할 user 정보
    • password: user 비밀번호

엔티티 매니저


Spring 애플리케이션의 엔티티 객체의 생명주기를 관리

  • 영속성 컨텍스트를 통해 엔티티 객체의 상태를 관리
  • persistence 유닛 네임을 매개변수로 받아서 해당 객체를 찾고 jdbc를 동작시키기 위한 기반 객체를 생성
  • 실질적인 DB의 CRUD를 실행하는 객체
  • 사용할때마다 하나씩 새로 생성해서 사용
  • 엔티티 매니저는 조회한 데이터를 persistence context에 보관해서 관리
  • persistence context
    • 엔티티를 영구적으로 저장하는 환경
  • 내부에 단 하나의 persistence context를 보유하고 있음
  • persistence context 안에 들어온 엔티티는 상태를 기반으로 생명주기를 가짐
    • Transient - 엔티티 매니저와는 상관이없는 객체 상태 (비 영속 상태)
    • Manged - 엔티티 매니저(영속성 컨텍스트)에 저장되어 관리되고 있는 상태 (영속 상태)
    • Detached - 한번 저장 되었다가 엔티티 매니저의 관리에서 분리된 상태 (준 영속 상태) → 변경 감지가 안됨
    • Removed - 관리 되었다가 삭제된 상태 → DB에 반영
profile
Abong_log

0개의 댓글