로그인 오류 잡기

Jan 31, 2024
로그인 오류 잡기

1. 로그인 할 때 터지는 것 해결하기

  • 원인 : 받을 때 결과 값이 없어서 터짐
  • 게시글 내부에 try/catch가 내재되어 있을 때
내가 만든 것이 아니니까 직접 제어할 방법 : 위치를 찾아서 직접 try/catch로 묶기
  • @Entity
Entity : 테이블
반드시 @entity가 걸려있는 class여야 파싱이 됨
응답 받을 때) object를 리턴하니까 다운 캐스팅해서 받으면 됨
💡
오류가 안나오면 = 어디서 터졌는지 모르면
하나하나 다 번호를 남겨서 실행해서 위치를 찾으면 됨
notion image
notion image
 

2. 위치를 찾아서 직접 try/catch로 묶기

package shop.mtcoding.blog.user; import jakarta.persistence.EntityManager; import jakarta.persistence.Query; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; @Repository // 내가 new 하지 않아도 메모리에 띄울 수 있음 public class UserRepository { private EntityManager em; // 컴포지션 public UserRepository(EntityManager em) { // 생성자 this.em = em; } @Transactional // DB에 변경을 초래할 떄 사용 public void save(UserRequest.JoinDTO requestDTO) { // 컨트롤러는 정보를 전달하면서 때리고 위임함 System.out.println("UserRepository에 save메서드 호출됨"); Query query = em.createNativeQuery("insert into user_tb(username, password, email) values (?, ?, ?)"); query.setParameter(1, requestDTO.getUsername()); query.setParameter(2, requestDTO.getPassword()); query.setParameter(3, requestDTO.getEmail()); query.executeUpdate(); } // select문은 @Transactional 안해도 됨 public User findByUsernameAndPassword(UserRequest.LoginDTO requestDTO) { System.out.println("UserRepository에 findByUsernameAndPassword메서드 호출됨"); Query query = em.createNativeQuery("select * from user_tb where username=? and password=?", User.class); // 알아서 매핑해줌 query.setParameter(1, requestDTO.getUsername()); query.setParameter(2, requestDTO.getPassword()); try { // 내부적으로 터지면 터지는 위치를 찾아서 내가 잡으면 됨 User user = (User) query.getSingleResult(); return user; } catch (Exception e) { return null; } } }
💡
컨트롤러 만들 때 책임 다 만들기!
다 만들고 넘어가면 컨트롤러에서 오류가 나지 않음
그렇지 않으면 컨트롤러에서 난 오류를 DB가 출력해 줌
notion image
notion image
 

3. try/catch 안 하는 이유

  • 터트린 것을 잡겠다는 것 → 통신만 이루어지지 않음
insert 시도하기 위한 하드디스크 접촉까지 일어나 IO가 일어남
  • DB는 하드디스크에 저장된 데이터를 저장된 문서를 들고 있는 것을 메타 데이터로 적어놓음
안 적어놓으면 직접 찾아가서 넣으려고 하다가 못 넣어서 실패하는 과정 또한 비용이 많이 듦
→ 데이터 사전(메타데이터)같은 것 : 데이터 사서가 확인해서 오류이면 터뜨림
  • 경우의 수가 너무 다양해서 에러를 명확하게 판단하기 힘듦
→ try/catch 는 어쩔 수 없는 상황에서 써야 함
 

4. 유효성 검사를 미리 감지

  • try/catch보다 코드를 짜는게 더 좋음!!
  • 얘도 조회해야되니까 IO가 일어나긴함
ex) 3명이 오차 없이 정확하게 동시에 접속해서 join요청을 함
각각 3개의 스레드가 생김 → 리쿼스트 객체 2개가 각각 생성
UserController는 메모리에 하나 떠 있음
join이라는 메서드는 호출(실행)시 스택 메모리에 뜸
→ 객체는 1개이나 메서드는 3개가 될 수 있음
동시에 실행되고 독립적인 공간이 생기니까 싱크로나이즈드 할 필요가 없음
DAO도 메서드라 동시에 실행됨
  • read는 동시에 가능함
  • write가 있는 순간 불가능해짐
ex) 회원가입을 하는데 데이터에 ssar만 있음
3다 db에 cos라는 id가 있는지 동시에 요청해서 없는 것을 확인
3다 동시에 cos라고 요청하면 두 명은 터지게 됨
→ read는 상관없음 insert때문에 터지는 것
insert는 한 명에게 rock을 걸려서 다른 사람들은 isolation(고립)됨
다른 사람을 느리게 만드는 wait가 걸리니까 최대한 자제하는 것이 좋음
얘 때문에 다른 사람이 rock 걸릴 수가 있으니까 최대한 안 터뜨리는 것이 좋음
@PostMapping ("/join") public String join(UserRequest.JoinDTO requestDTO){ System.out.println(requestDTO); //@DATA안에 String도 포함되어있음 //1. 유효성 검사 if(requestDTO.getUsername().length() <3){ return "error/400"; } //2. 동일 username 체크 //3. Model에게 위임하기 try { // 터트린 것을 잡겠다? userRepository.save(requestDTO); //경우의 수가 너무 다양함 : 에러를 명확하게 판단하기 힘듦 } catch(Exception e){ } return "redirect:/loginForm"; //리다이렉션불러놓은게 있어서 다시부른거 }
 
Share article

vosw1