질문을 삭제하지 말아주세요.!
 
1
0
-1

라라벨 auth 설치하면 생기는 User 모델에 대해서 질문좀 하고자 하는데요.

기본적으로 사용자 생성함에 있어서 User 모델에 PK는 자동증가 인데요. 이걸 해제하고 임의의 문자코드로 자동생성하고 싶습니다.


과정으로는 그냥 하면 안되고, 사용자코드번호를 가지고 있는 시리얼 테이블에 하나의 Row 를 만들고 이 테이블로 부터 사용자 코드를 증가 시키면서 새롭게 코드를 만들려고 합니다. 그럴려면 테이블 락킹도 발생할테구요.


그런데 아무리 찾아봐도 사용자 생성하는 컨트롤러에 사용되는 

return User::create()..... <--- 요녀석이 어디에 정의됐는지를 모르겠더라구요. 그냥 다짜고짜 리턴해버려서...

실패했을때는 뭐를 반환하는지도 모르겠고..


다음과 같은 거라고 예상하는데요.

가입컨트롤러.php

-- 생략 --

protected function create(array $data, Request $request){
			return User::create([
				'uid' => $uid, 
				'email' => $data['email'],
				'phone' => $data['phone'],
				'first_name' => $data['first_name'],
				'last_name' => $data['last_name'],
				'initial_name' => $data['initial_name'],
				'age_cd' => $data['age_cd'],
				'gender_cd' => $data['gender_cd'],
				'type_cd' => $this->type,
				'password' => bcrypt($data['password']),
			]);
	}

실제 함수 안에서는 ,,,,

  1. 트렌젝션 시작
  2. uid 코드를 시리얼테이블에서 현재 값을 가져와 '00000001' 등으로 코드를 생성,
  3. 시리얼테이블을 1증가 후 업데이트
  4. uid 코드를 대입
  5. 사용자 생성이 정상종료할 경우, 시리얼테이블 커밋
  6. 트렌젝션 종료.


아직 php 도 모르고 라라벨도 모르지만, 대충 저런형태를 생각중입니다. 그냥 autoincrement 쓰세요~ 마시구요.

제 임의의 코드 생성을 하고 싶어서 그런거구요.


User::create 의 리턴은 뭔지가 궁금하구요..

사용자 등록이 됐는지 않됐느지 알수 있는지도 궁금하네요. 그걸 알아야 시리얼 테이블 업데이트하고 커밋할수 있으니 말이져;;;;








    CommentAdd your comment...

    2 answers

    1.  
      2
      1
      0

      1) 왜 auto_increment를 사용하지 않으려는지 여쭤봐도 될까요?

      역 질문과 별개로 제 의견을 남기면, 다른 테이블 또는 변수에 의존하는 ID를 derived id라고 하고, 대가(大家)들은 안티패턴이라합니다. 라라벨 엘로퀀트 뿐만아니라 DB에 의존하는 설계의 일반적인 문제점인데요, save() 하기 전에는 엔티티의 식별자(identity)가 없어서 엔티티가 불완전한 상태라는 건데... 이 문제점을 해결하고 계신 것으로 추정됩니다. UUID를 사용하실 것을 권장합니다. 라라벨에 기본 포함되어 있고 \Ramsey\Uuid\Uuid::uuid4() 호출로 안전한 식별자를 얻을 수 있습니다. 대가들에 의하면 1ms당 한번씩 호출해서 100년 동안 루프 돌면 한번 중복이 발생할 수 있다고 합니다.


      2) 트랜잭션 처리는 다음과 같이 합니다.

      \DB::transaction();beginTransaction();

      try {

          // DB 상태 변경, 애플리케이션 로직 수행 등등

          \DB::commit()

      } catch (\Exception $e) {

          // 예외 처리

          \DB::rollBack();

          throw $e;

      }


      3) 파사드(디자인 패턴의 파사드와 다릅니다.)때문에 찾기 어려운 겁니다.

      보통 남이 짠 서비스를 볼 때 outside-in으로 보는데요. 라우팅에서 맵핑된 컨트롤러와 메서드를 찾는 식이죠. make:auth 명령을 수행하면, web.php에 Auth::routes() 라는 구문이 생기는데, Auth 파사드(IoC에 등록된 객체의 별칭)를 찾아가는 것이 쉽지 않습니다.

      \App\Http\Controllers\Auth\RegisterController::create() 를 찾고 계신 것이 아닐까 싶습니다. 라라벨의 엘로퀀트는 액티브레코드 패턴으로 구현되어 있습니다. 뭐 사실 구현과 무관하지만, User 모델이 상속하는 \Illuminate\Database\Eloquent\Model 까지 파고 들어가서 코드를 읽어 보면 ... (머리만 어지럽습니다. ㅎㅎ)


      4) 또 하나 궁금증인데요. PHP를 하시기 전에 어떤 언어나 프레임워크를 하셨나요?


        CommentAdd your comment...
      1.  
        1
        0
        -1

        저 같은 경우는 user의 id 노출이 발생할 수 있는 페이지에서 id 노출을 막기 위해 라라벨의 bcrypt() 메소드로 auto increments되는 id를 hash한 값을 Users 테이블에 hashkey 컬럼을 추가해서 넣어 놓고 사용중입니다.

        회원가입 시에는 hash값이 들어가지 않고, 회원이 인증절차를 거치면 hash값을 넣도록 개발했습니다.


        그리고 전 Controllers\Auth\RegisterContoller.php에서 기본으로 사용하고 있는 RegisterUsers 트레이트를 사용하지 않고 따로 register() 메소드를 만들어서 사용하고 있습니다. 

        기본 사용하고 있는 트레이트를 사용하지 않고, 제공되는 users 테이블의 migration 을 수정($table→increments('id'); 를 삭제하고 임의의 문자코드를 key로 하도록 추가)한다면 일단 라피라피님이 원하시는대로 개발은 할 수 있을것이라고 생각합니다.


        하지만 저도 개발하다 보니 auto increment 되는 id값이 있는 편이 모델을 다룰 때 참 편하더라구요^^

          CommentAdd your comment...