내일배움캠프 D+64: 0620

enyo9rt·2022년 6월 20일

TIL-S

목록 보기
43/79

🌌 실시간 강의

오늘은 Docker로 이미지와 컨테이너를 생성하고 실행해보는 시간을 가졌다.
이미지는 클래스, 컨테이너는 객체로 생각하면 편하다.
도커허브에서 repository를 생성하면 git처럼 push하고 pull해서 개발환경을 일치시키는 것이 더욱 편리해진다.

++
vim install.sh
i 누르고 실행 구문 넣고
esc 후 :wq
sh install.sh


🍃 Spring 심화반 -5주차(완강)

값이 큰 수는 쉼표 자리마다 _넣어서 표현해도 원래 숫자처럼 알아듣는다.

API실행 시간을 잴 때 epoch time을 사용한다.
❔ epoch? epoch 이란 단어를 번역하자면, 중요한 사건이나 변화가 있었던 시대(era)를 의미하는데,
Unix와 POSIX 등의 시스템에서 날짜와 시간의 흐름을 나타낼 때 기준을 삼는 시간
(00:00:00 UTC on January 1, 1970)을 나타내는 단어
출처

❔ AOP? Aspect Oriented Programming
시간을 측정하는 부가 기능을 따로 떼놓고 핵심 기능마다 추가시키면 유지보수가 더 쉽다.

어드바이스 - 부가 기능
포인트 컷 - 부가 기능을 적용할 위치

내가한거
원래처럼 리스트로 받아와서 하나하나 체크하는데, 기존 폴더에 중복되는 이름이면 exception을 발생토록 했다.
주의할 점은 트랜잭션을 달아뒀으면 원하는 대로(중복 폴더와 함께 생성된 폴더는 저장x)실행되지는 않으니 빼야한다.

	public List<Folder> createFolders(List<String> folderNameList, Users user) {
		List <Folder> existFolderList = folderRepository.findAllByUserAndNameIn(user, folderNameList);
		List<Folder> folderList = new ArrayList<>();
		for (String folderName : folderNameList) {
			if (isExistFolderName(folderName, existFolderList)) {
				throw new IllegalArgumentException("exception");
			}
			else {
				Folder folder = new Folder(folderName, user);
				folderList.add(folder);
			}
		}
		folderList = folderRepository.saveAll(folderList);
		return folderList;
	}
    
    
    	public boolean isExistFolderName(String folderName, List<Folder> existFolderList) {
		// 기존 폴더 리스트에서 folder name 이 있는지?
		for (Folder existFolder : existFolderList) {
			if (existFolder.getName()
			               .equals(folderName)) {
				return true;
			}
		}
		
		return false;
	}
  1. 예외 발생 시, 그동안 DB 에 저장된 폴더들을 삭제
		public List<Folder> createFolders(List<String> folderNameList, User user) {
        List<Folder> folderList = new ArrayList<>();

        for (String folderName : folderNameList) {
            // 1) DB 에 폴더명이 folderName 인 폴더가 존재하는지?
            Folder folderInDB = folderRepository.findByName(folderName);
            if (folderInDB != null) {
                // 그동안 저장된 폴더들을 모두 삭제!
                for (Folder folder : folderList) {
                    folderRepository.delete(folder);
                }

                // DB 에 중복 폴더명 존재한다면 Exception 발생시킴
                throw new IllegalArgumentException("중복된 폴더명 (" + folderName +") 을 삭제하고 재시도해 주세요!");
            }

            // 2) 폴더를 DB 에 저장
            Folder folder = new Folder(folderName, user);
            folder = folderRepository.save(folder);

            // 3) folderList 에 folder Entity 객체를 추가
            folderList.add(folder);
        }

        return folderList;
    }
  1. 트랜잭션 (@Transactional) 을 이용
		@Transactional
		public List<Folder> createFolders(List<String> folderNameList, User user) {
        List<Folder> folderList = new ArrayList<>();

        for (String folderName : folderNameList) {
            // 1) DB 에 폴더명이 folderName 인 폴더가 존재하는지?
            Folder folderInDB = folderRepository.findByName(folderName);
            if (folderInDB != null) {
                // DB 에 중복 폴더명 존재한다면 Exception 발생시킴
                throw new IllegalArgumentException("중복된 폴더명 (" + folderName +") 을 삭제하고 재시도해 주세요!");
            }

            // 2) 폴더를 DB 에 저장
            Folder folder = new Folder(folderName, user);
            folder = folderRepository.save(folder);

            // 3) folderList 에 folder Entity 객체를 추가
            folderList.add(folder);
        }

        return folderList;
    }

❔ 트랜잭션? Transactional 데이터베이스에서 데이터에 대한 하나의 논리적 실행단계
ACID (원자성, 일관성, 고립성, 지속성)는 데이터베이스 트랜잭션이 안전하게 수행된다는 것을 보장하기 위한 성질을 가리키는 약어
트랜잭션은 최소 단위 의 작업이다. 모두 저장되거나 아무 것도 저장되지 않는 것을 보장한다. 모 아니면 도!

try-catch로 트랜잭션 생성, commit 하고 catch로 rollback
그런데 @Transactional 을 붙여주면 AOP에 의해 프록시 객체가 생성된다.

트랜잭션 리드온
@Transactional(readOnly = false) 기본값
Primary(쓰기 전용)이 Replica(읽기 전용)로 싱크되는 것을 Replication이라고 한다.

Handler에 ControllerAdvice를 달아놓으면 AOP에 의해 컨트롤러에 예외 발생시 처리됨

SAVE 💾

도커에 대해 이해도가 조금 높아진 하루였다. 클래스와 객체라고 생각하니 이해하기 정말 쉬웠다. EC2에 도커를 설치하고 실행하니 너무 편했다...!! 또한 스프링 심화 강의를 드디어 끝마쳤는데, 끝이 아닌 시작이다 싶었다. 프로젝트 직전까지 스프링을 좀 더 열심히, 하다 남은 JWT 공부도 해두자!

0개의 댓글