1. 쿠키 사용로그인 상태를 유지하기 위해서는 쿠키를 사용할 수 있다. 서버에서 로그인에 성공하면 HTTP 응답에 쿠키를 담아서 전달하고, 브라우저는 앞으로 해당 쿠키를 지속적으로 보내면 된다. 쿠키의 종류는 다음과 같다.영속 쿠키: 만료 날짜를 입력하면 해당 날짜까지 유지된다.세션 쿠키: 만료 날짜를 생략하면 브라우저 종류시까지만 유지된다.우리는 세션 쿠키를 사용해볼 것이다. 쿠키는 다음과 같이 response에 담을 수 있다.@PostMapping("/login")public String login(@Valid @ModelAttribute LoginForm form, BindingResult bindingResult, HttpServletResponse response) { ... ..
1. Bean Validation이전 포스팅의 Validation 코드들을 보면, reject, rejectValue 등의 메소드를 활용해 검증을 수행했다. 하지만 이런 코드들은 너무 번거롭다. 하지만 특정 필드의 검증 로직은 대부분 빈 값인지, 특정 범위 안에 있는지 등 일반적인 것들을 목표로 한다. Bean Validation은 이러한 공통된 일반적인 검증 로직들을 @NotBlank, @Range, @Max 등의 어노테이션으로 제공한다.Bean Validation이란 검증 로직을 모든 프로젝트에 적용할 수 있도록 공통화/표준화한 것이다.사실 Bean Validation은 기술 표준(인터페이스)으로 구현체가 따로 있는데, 주로 사용하는 구현체는 하이버네이트 Validator이다. (JPA라는 표준 기술..
1. 검증 직접 처리사용자가 잘못된 값을 입력했는지, 입력하지 않은 값은 없는지를 체크하기 위해서는 검증을 수행해야한다. 검증을 위해 전달된 값들이 우리가 원하는 의도된 값인지 아래와 같이 각각 직접 확인해줄 수 있다.@PostMapping("/add")public String addItem(@ModelAttribute Item item, RedirectAttributes redirectAttributes, Model model) { // 검증 오류 결과를 보관 Map errors = new HashMap(); if (!StringUtils.hasText(item.getItemName())) { errors.put("itemName", "상품 이름은 필수입니다."); }..
1. 체크 예외와 인터페이스이전 서비스 코드를 보면 아직 서비스 계층이 SQLException이라는 서비스에서 처리할 수 없는 예외에 의존하고 있는 것을 알 수 있다.@Slf4j@RequiredArgsConstructorpublic class MemberServiceV3 { private final MemberRepositoryV3 memberRepository; @Transactional public void accountTransfer(String fromId, String toId, int money) throws SQLException { bizLogic(fromId, toId, money); } private void bizLogic(String fromI..
1. 기존 코드의 문제점1.1. 애플리케이션 구조애플리케이션에서 단순하지만 많이 사용하는 방법은 아래와 같이 3계층으로 나눈 방식이다.프레젠테이션 계층: UI와 관련된 처리를 한다.서비스 계층: 비지니스 로직을 담당한다.데이터 접근 계층: 데이터베이스 접근을 담당한다. JDBC, JPA 등이 해당한다.세 가지 계층 중 가장 중요한 것은 서비스 계층이다. 비지니스 로직이 담겨있기 때문에 최대한 변경 없이 유지되어야 하며 이를 위해 특정 기술에 종속적이지 않게 해야한다. 따라서 UI 관련 기술들은 프레젠테이션 계층에서, 데이터 접근 기술들은 데이터 접근 계층에서 담당하여 서비스 계층은 기술에 종속되지 않도록 한다.1.2. 문제점이전 비지니스 코드의 내용은 다음과 같다.@Slf4j@RequiredArgsCon..
1. 트랜잭션이란?1.1. 트랜잭션의 기본 이해트랜잭션의 사전적 정의는 "거래"다. 이때 데이터베이스에서 트랜잭션이란 하나의 거래를 안전하게 처리하도록 보장함을 의미한다. 근데 하나의 거래를 안전하게 처리하려면 고려할게 많다. 예를 들어, A의 돈을 B에게 이체한다고 하자. 그럼 A의 잔고 값을 감소시키고, B의 잔고 값은 증가시켜야한다. 만약 두 작업 중 하나는 성공하고, 하나는 실패하는 경우는 문제가 된다. 이런 경우 트랜잭션은 작업 1, 2가 모두 성공되어야 데이터를 저장한다. 하나라도 실패하면 거래 전의 상태로 되돌린다. 이때, 모든 작업이 성공하여 데이터베이스에 반영하는 것을 Commit이라고 부르고, 하나라도 실패하여 이전 상태로 되돌리는 것을 Rollback이라고 부른다.1.2. ACID트랜..
0. AbstractAbstract 부분에서는 기존에 사용하던 fine-tuning과 저자들이 제시하는 prefix-tuning을 비교하고 있다.Fine-tuning→ downstream task를 처리하기 위해 전체 파라미터를 모두 학습해야 하며, 해당 모델을 저장할 때에도 모델 전체를 copy해야한다.Prefix-tuning→ Langauge model의 parameter들은 freeze한다. 대신 앞에 붙여지는 continuous task-specific vector를 optimize하는 방식이다. 이때 continous task-specific vector를 prefix라고 부른다. Prefix-tuning은 prompting에서 영감을 받았다고 한다. 이때 prompt와 관련된 의미들은 다음과 ..
1. IntroductionNLP를 다루는 많은 Application들은 매우 큰 PTLM을 여러 downstream task를 다루기 위해 adapting 방식을 사용했다. adaptation은 일반적으로 pre-trained model의 전체 파라미터를 update하는 fine-tuning을 사용했다. 하지만 점차 NLP에서 개발되는 모델들이 커지면서 이런 방법은 굉장히 비효율적이게 되었다. (GPT3만 봐도 175 billion개의 학습가능한 파라미터가 존재한다. 이를 모두 학습시킬려면 시간적으로도, 컴퓨팅 자원적으로도 비용이 굉장히 많이든다.) 따라서 위와 같은 fine-tuning 방식을 피하기 위해 몇 개의 파라미터만을 adapting하거나 외부 모듈을 학습하는 방식이 계속 연구되고 있다. (..