게시글
질문&답변
2023.07.26
나만의 프레임워크 작성 후, 운영환경 배포에 관한 문의 드려요
안녕하세요. 우선, 라우팅을 먼저 확인해보는 것이 좋을 것 같습니다. /call 을 불렀을 때 index.php 가 실행되었다는 것은 일단 OK, 그 다음은 index.php , 즉 프론트 컨트롤러에서 실행된 라우터에 의해 사용자의 요청이 /call 에 도달하여 컨트롤러가 실행되는지 확인하는 것인데, 내장 서버에서는 동작하나, 범용 웹서버에서 동작하지 않는 경우 $_SERVER 를 확인해보는 것도 방법입니다. 아래의 질문을 참고해보시기 바랍니다. https://www.inflearn.com/questions/52447/apache%EC%97%90-%EC%98%AC%EB%A6%B4%EA%B2%BD%EC%9A%B0 위의 내용은 아파치에서 실행한 것이지만, nginx 에서도 같은 맥락으로 문제가 발생했을 수도 있습니다.
- 0
- 1
- 297
질문&답변
2023.05.30
35강 미들웨어에서 인증 과정을 Auth클래스로 만들면, 어느 디렉토리에 둘까요?
안녕하세요. 강의를 다시 보니 제가 라라벨의 Auth 를 예로 들었네요. 예로 든 라라벨의 Auth 클래스의 사용법을 간단하게 살펴보겠습니다. 라라벨에서 Illuminate\Support\Facades\Auth 클래스는 사용자가 인증 기능을 쉽게 사용할 수 있도록 해주는 헬퍼 클래스로 사용됩니다. 그래서 내부의 구현과는 관계없이 사용자가 단순한 형태로 사용할 수 있는 형태입니다. use Illuminate\Support\Facades\Auth; if (Auth::check()) { // The user is logged in... } 로그인도 Auth::attempt() 를 사용하여 간단하게 사용할 수 있습니다. 라라벨에서는 헬퍼 클래스를 지칭할 때 파사드(Facades)라는 개념을 사용하는데, 레거시 환경에서도 Auth 클래스를 단순한 헬퍼 클래스로 취급하여 Helpers 라는 네임스페이스 및 디렉토리에 위치시키는 것을 고려해볼 수 있습니다. if (Auth::attempt($credentials)) { $request->session()->regenerate(); return redirect()->intended('dashboard'); } 다만, 라라벨의 헬퍼 클래스는 개발자가 사용할 때 Auth::attempt() 와 같은 형태를 나타내고 있지만, 내부적으로는 서비스 컨테이너 바인딩을 통해 AuthManager , StatefulGuard 와 같은 클래스와 인터페이스의 메서드를 프록시합니다. 이 부분은 라라벨에 대한 내용이므로 이 강의와는 무관한 이야기이기에 여기서 생략하겠습니다만, 아무튼 강의에서 예시를 든 부분은 코드에서 예를 든 것처럼 헬퍼 클래스로 취급하여 사용하는 것을 이야기합니다.
- 0
- 1
- 221
질문&답변
2023.05.15
터미널에 글이 안써집니다.
안녕하세요. :) 터미널을 보아하니 cmd 혹은 powershell 인 것으로 파악됩니다. 윈도우에서 기본적으로 설치하면 둘 중에 하나로 되어있을 거에요. 강의에서 사용한 터미널은 git bash 입니다. 또한 터미널에서 서버를 켜고 다른 명령어 입력이 불가능한 경우 터미널 오른쪽 상단에 있는 + 을 눌러서 새로운 터미널을 열고 작업해주시면 되겠습니다. VSCode 에서 기본 터미널을 변경해서 사용하셔도 되고, 터미널을 별도로 열어서 사용하셔도 됩니다.
- 0
- 1
- 407
질문&답변
2023.05.10
ios환경에서는 어떻게 설치해야 하나요?
안녕하세요. 맥은 제가 한 번도 써본 적이 없어서 답변을 드리기 어렵습니다. Homebrew 를 사용해서 설치가 가능할 것으로 생각됩니다.
- 0
- 1
- 284
질문&답변
2023.04.16
라라벨(php) 배포 문의
안녕하세요. 라라벨을 배포하기 위한 환경과 PHP 를 배포하기 위한 환경은 기본적으로 똑같습니다. 아파치 서버가 PHP 를 실행할 수 있는 상태여야 하며, 추가적으로 라라벨을 실행하기 위한 확장 과 웹서버 의 설정이 필요합니다. 이에 대한 내용은 라라벨의 공식문서를 통해 확인하실 수 있습니다. 아파치를 위한 설정은 라라벨 프로젝트의 .htaccess 에 명시되어 있을 것입니다. 현 시점의 라라벨의 최신버전은 10.x 이나 개발하고 계신 라라벨의 버전이 8.x 이므로 이에 해당하는 문서의 링크를 명시합니다. https://laravel.com/docs/8.x/deployment 그 밖에 배포를 처리하기 위해서는 가장 단순한 방법으로, FTP 를 사용해도 되고, 깃허브 액션 등을 사용하여 CI/CD 를 구축하셔도 됩니다. 다만, 카페24 호스팅에 라라벨 프로젝트 배포하기 를 이해하지 못하신 경우 CI/CD 를 구축하는 일은 번거롭기 때문에 단순하게 파일을 업로드하는 방식인 FTP 를 통한 배포를 권장드립니다.
- 0
- 1
- 1.3K
질문&답변
2023.04.12
왜 http://localhost/ 로 접근하면 public/index.php 가 실행되나요?
안녕하세요~~ 일반적으로 웹서버에서 루트 URL에 해당하는 / 의 경우 기본 값이 index.html 또는 index.php 로 지정됩니다. 프론트 컨트롤러(Front Controller) 라고도 합니다. 서버에서 별도로 지정을 해주지 않고도 index.php 가 홈을 위한 파일로 지정됩니다. / 로 요청을 하면 index.php 로 요청이 됩니다. 또한 /posts 와 같이 요청을 해도 index.php 로 요청됩니다. 아파치를 사용할 때는 .htaccess 로 설정해주는 경우도 있습니다.
- 0
- 1
- 1.8K
질문&답변
2023.04.10
http://localhost:8080/posts/1 접근시 배열 0값 표기 오류
안녕하세요. $id 값을 못 읽어오는 경우, 라우트 주소를 파싱할 때 문제가 발생했을 수도 있습니다. 이럴 때는 RequestContext::match() 를 살펴보는 것이 좋습니다. 강의에 쓰인 원본 소스코드는 다음과 같습니다. 로직이 잘못 처리된 곳이 있는지 점검 후 다시 시도해보시기 바랍니다. 아래의 소스코드는 URL 을 / 로 분리한 뒤, 정규식을 사용해서 파라매터가 요구되는 패턴인지 파악하고 사용자가 요청한 주소와 매핑시켜 처리하고 있습니다. public function match($url) { $urlParts = explode('/', $url); $urlPatternParts = explode('/', $this->path); if (count($urlParts) === count($urlPatternParts)) { $urlParams = []; foreach ($urlPatternParts as $key => $part) { if (preg_match('/^\{.*\}$/', $part)) { $urlParams[$key] = $part; } else { if ($urlParts[$key] !== $part) { return null; } } } return count($urlParams) $urlParts[$k], array_keys($urlParams)); } }
- 0
- 1
- 226
질문&답변
2023.04.05
일반적으로 쓰이지 않는 폰트 부분
안녕하세요. 강의에서 사용된 폰트는 네이버에서 제작한 오픈소스 폰트인 D2Coding 입니다. 또한 기호가 일반적인 폰트와 다른 이유는 Ligature 가 적용되었기 때문입니다. Ligature 스타일은 분리되어 있는 두 개 이상의 글자를 합쳐서 표현한 것을 의미합니다. 연산자 강의에 쓰인 모든 내용을 이야기하기에는 내용이 많기 때문에 간단한 예로 표현하겠습니다. 그 예로는 다음과 같습니다. (사진)
- 0
- 1
- 303
질문&답변
2023.03.22
localhost 접근했을때 최초 페이지가 그려지기까지와 href동작문의
안녕하세요. MVC 를 처음 접하시는 거라면 어려울 수 있습니다. 저도 레거시에서 MVC 를 이해하기까지는 시간이 제법 걸렸기 때문입니다. 자바의 스프링 프레임워크와 같은 곳에서는 일상적으로 쓰이고 있으나 PHP 에서는 레거시에서 나아가야 하기 때문에 더 그럴 것입니다. 순서에 대한 이해는 잘 하신 것으로 생각됩니다. 다시 한 번 살펴보기 위해 이 내용은 그림으로 설명하는 것이 조금 더 명확하므로 그림으로 나타내겠습니다. 사용자가 / 라는 경로로 요청을 했을 때를 그림으로 나타내면 다음과 같습니다. (사진) 사용자의 요청은 public/index.php 로 모두 모이게되며, 그 다음 부트스트래핑(Bootstrapping) 과정을 거친 이후, routes/web.php, routes/api.php 에 명시된 라우트에서 사용자가 요청한 라우트에 등록된 컨트롤러를 실행합니다. 해당 컨트롤러에서 view 를 반환하는 경우 데이터와 함께 반환할 수 있으며, view 에서는 레이아웃을 포함하고 데이터를 지정합니다. 에 대한 내용은 HTML 과 관련된 내용이므로 제가 답변드리기 보다는 MDN 을 참고하는 것이 더 좋습니다.
- 0
- 1
- 532
질문&답변
2023.03.20
readmore 클릭시 쿼리내용 받아오는게 이해가 안되요
안녕하세요. 정상우입니다 :D Domparser 사용해서 html을 새로 그린다는건 알겠는데 get방법을 사용한 이유가 있나요? 중요하지 않은 정보의 경우 GET 으로 처리하는 것이 일반적이고, '읽기' 또는 '정보 요청' 의 경우 GET 으로 처리합니다. 검색어에 대해서도 GET 으로 처리합니다. 이는 제 강의 뿐만 아니라 다양한 서비스의 사례에서도 확인하실 수 있습니다. 블로그나 검색도 마찬가지입니다. page값이 변경된 새로운 쿼리를 실행시켜 실행된 값들을 저장하는 코드가 어느부분인걸가요? page 쿼리 파라매터를 받아오는 부분은 index.php 의 초반부 코드인 다음과 같은 부분입니다. page 를 받아오지 못하면, 즉 쿼리 파라매터가 주어지지 않은 경우 $page ?: 0 에 의해 거짓으로 판단되어 0 으로 처리되며 SELECT * FROM posts ORDER BY id DESC LIMIT 3 OFFSET 0 가 최종적으로 처리됩니다. $page = filter_input(INPUT_GET, 'page', FILTER_VALIDATE_INT); $page = $page ?: 0; $stmt = mysqli_prepare($GLOBALS['DB_CONNECTION'], 'SELECT * FROM posts ORDER BY id DESC LIMIT 3 OFFSET ?'); $page = $page * 3; mysqli_stmt_bind_param($stmt, 'i', $page); 그러나 /?page=1 과 같이 주어진 경우 $page ?: 0 가 참으로 처리되므로 $page 의 초기 값으로 1 이 할당되고, 그 이후 $page * 3 에 의해 3 이 할당됩니다. 따라서 결론적으로 SELECT * FROM posts ORDER BY id DESC LIMIT 3 OFFSET 3 로 쿼리가 실행됩니다. 쿼리 파라매터에 따라 반환하는 결과 페이지가 달라지는 것은 이 때문입니다.
- 0
- 1
- 376