window11 php7.3버전 phpstorm curl 사용하려고 했는데 php.ini 관련설정 되어있음에도 phpinfo파일에서 curl enable되지 안음

phpstorm에서 php내장서버 정지했는데도 php서버 계속 돌아가는듯 보였음

 

해결

1. PHP 프로세스의 PID 찾기:

먼저 netstat 명령어와 find 명령어를 사용하여 PHP가 사용 중인 포트와 해당 포트의 PID 확인

netstat -ano | find "8080" # 8080을 PHP가 사용하고 있는 포트 번호로 바꿔 위의 명령어를 실행

2. 프로세스 종료:

taskkill /F /PID PID_VALUE
여기서 PID_VALUE는 앞서 netstat 명령어로 찾은 PID 값을 사용

위의 단계를 완료하면, 해당 포트에서 실행 중인 PHP 프로세스가 종료

'문제해결' 카테고리의 다른 글

프로젝트url변경  (0) 2019.03.26

예외처리란 프로그램 실행 중에 발생할 수 있는 예외 상황을 미리 예측하고, 적절한 처리를 통해 프로그램의 비정상적인 종료를 방지하는 것입니다.

예외처리는 다음과 같은 장점이 있습니다.

  • 프로그램의 안정성과 신뢰성을 높일 수 있습니다.
  • 프로그램의 디버깅과 유지보수를 용이하게 할 수 있습니다.
  • 사용자에게 친절한 에러 메시지를 제공할 수 있습니다.

자바에서는 예외처리를 위해 try-catch-finally 구문과 throws 키워드를 제공합니다. try 블록은 예외가 발생할 가능성이 있는 코드를 작성하는 곳이고, catch 블록은 예외가 발생했을 때 처리하는 코드를 작성하는 곳입니다. finally 블록은 예외 발생 여부와 상관없이 항상 실행되는 코드를 작성하는 곳입니다. throws 키워드는 메소드 선언부에 사용하여 해당 메소드가 발생시킬 수 있는 예외를 명시하는 것입니다.

예외는 크게 두 가지로 나눌 수 있습니다. 첫 번째는 컴파일러가 미리 체크해주는 체크 예외(Checked Exception)이고, 두 번째는 컴파일러가 체크하지 않고 런타임에 발생하는 언체크 예외(Unchecked Exception)입니다. 체크 예외는 반드시 try-catch 구문이나 throws 키워드로 처리해야 하며, 그렇지 않으면 컴파일 에러가 발생합니다. 언체크 예외는 처리하지 않아도 컴파일 에러가 발생하지 않지만, 런타임에 프로그램이 종료될 수 있으므로 주의해야 합니다.

체크 예외와 언체크 예외의 차이

  • 체크 예외는 컴파일 시점에 발견되고, 언체크 예외는 실행 시점에 발견됩니다.
  • 체크 예외는 외부적인 요인으로 인해 발생하고, 언체크 예외는 내부적인 요인으로 인해 발생합니다.
  • 체크 예외는 개발자가 반드시 처리해야 하고, 언체크 예외는 개발자가 선택적으로 처리할 수 있습니다.

모든 에러와 예외 클래스는 Throwable 클래스로부터 상속받습니다. Throwable 클래스의 자식 클래스로 Error 클래스와 Exception 클래스가 있습니다.

Error 클래스는 시스템의 심각한 오류를 나타내는 Error 클래스와 달리 Exception 클래스는 개발자가 처리할 수 있는 예외입니다. Exception 클래스의 자식 클래스로는 RuntimeException 클래스와 그 외의 일반 예외 클래스가 있습니다. RuntimeException 클래스는 컴파일러가 예외 처리를 강제하지 않는 언체크 예외이고, 그 외의 일반 예외 클래스는 컴파일러가 예외 처리를 강제하는 체크 예외입니다.

RuntimeException 클래스의 대표적인 예외들

  • NullPointerException: null 값을 가진 참조 변수로 객체에 접근하려 할 때 발생합니다.
  • ArrayIndexOutOfBoundsException: 배열의 인덱스 범위를 초과하여 사용하려 할 때 발생합니다.
  • NumberFormatException: 문자열을 숫자로 변환할 수 없을 때 발생합니다.
  • ClassCastException: 허용되지 않는 타입 변환을 시도할 때 발생합니다.

일반 예외 클래스의 대표적인 예외들

  • IOException: 입출력 작업을 실패하거나 중단될 때 발생합니다. 파일을 열거나 읽거나 쓰는 과정에서 문제가 생길 수 있습니다.
  • ClassNotFoundException: 지정한 이름의 클래스를 찾을 수 없을 때 발생합니다. 클래스 이름이 잘못되었거나 해당 클래스가 존재하지 않을 수 있습니다.
  • SQLException: 데이터베이스와 관련된 작업을 수행할 때 발생합니다. 데이터베이스 연결이 끊기거나 쿼리문이 잘못되었거나 데이터 형식이 맞지 않을 수 있습니다.

 

스프링 트라이앵글


스프링 프레임워크에서의 스프링 트라이앵글은 스프링의 3대 요소를 나타내는 용어입니다. 이 요소들은 제어 역전(IoC), 관점 지향 프로그래밍(AOP), 추상화 서비스(PSA)입니다. 이 요소들은 스프링 프레임워크의 핵심 기능과 철학을 담고 있습니다.

제어 역전(IoC)

제어 역전(IoC)은 개발자가 아닌 프레임워크가 객체의 생성과 의존성 주입을 관리하는 것을 말합니다. 이를 통해 개발자는 객체 간의 결합도를 낮추고 유연한 코드를 작성할 수 있습니다. 스프링에서는 IoC 컨테이너라고 불리는 ApplicationContext와 BeanFactory 인터페이스를 통해 IoC를 구현합니다. IoC 컨테이너는 빈 설정 소스로부터 빈 정의를 읽어들이고, 의존관계를 설정하여 빈을 구성하고 제공해줍니다.
빈은 스프링 IoC 컨테이너가 관리하는 객체로, 싱글톤으로 생성되며 필요할 때 주입받아 사용할 수 있습니다. IoC 컨테이너는 또한 빈의 생명 주기를 관리하며, 스프링의 라이프사이클 콜백 인터페이스를 이용하여 부가적인 기능을 수행할 수 있습니다.

관점 지향 프로그래밍(AOP)

관점 지향 프로그래밍(AOP)은 핵심 비즈니스 로직 외에 공통으로 처리되어야 하는 로그 출력, 보안 처리, 예외 처리 등의 코드를 모아서 처리하는 것을 말합니다. 이를 통해 개발자는 코드의 중복과 난잡함을 줄이고, 모듈성과 재사용성을 높일 수 있습니다.
스프링에서는 프록시 패턴을 기반으로 AOP를 구현합니다. 프록시 패턴은 핵심 로직을 구현한 객체에 접근하기 전에 중간에 다른 객체(프록시)를 두어 공통 기능을 적용하는 방식입니다. 스프링에서는 @Aspect 어노테이션을 이용하여 AOP를 적용할 클래스를 정의하고, @Pointcut 어노테이션을 이용하여 AOP를 적용할 메서드나 클래스를 지정합니다. 그리고 @Before, @After, @Around 등의 어노테이션을 이용하여 AOP를 적용할 시점을 정의합니다.

추상화 서비스(PSA)

추상화 서비스(PSA)는 외부 라이브러리들을 POJO로 사용할 수 있도록 일종의 껍데기를 씌워 추상화한 것입니다. 이를 통해 개발자는 스프링에서 추상화된 서비스들을 자바 언어로 자유롭게 사용할 수 있게 됩니다. 또한 완전히 다른 기술 스택으로도 애플리케이션이 작동할 수 있도록 해주어 코드를 바꿀 일이 줄어들게 됩니다.

스프링에서는 다양한 추상화 서비스를 제공하는데요. 예를 들면, 스프링 트랜잭션 추상화는 JDBC, JPA, Hibernate 등 다양한 트랜잭션 API를 하나의 인터페이스로 통일하여 사용할 수 있게 해줍니다. 스프링 캐시 추상화는 EhCache, Redis, Memcached 등 다양한 캐시 라이브러리를 하나의 인터페이스로 통일하여 사용할 수 있게 해줍니다. 스프링 웹 MVC 추상화는 서블릿 API를 직접 사용하지 않고도 웹 애플리케이션을 개발할 수 있게 해줍니다.

마무리

이렇게 스프링 트라이앵글에 대해 알아보았습니다. 스프링 트라이앵글은 스프링 프레임워크의 핵심 개념과 기능을 담고 있는 용어로, 스프링을 공부하고 사용하려면 반드시 알아야 하는 내용입니다. 스프링 트라이앵글을 잘 이해하고 적용하면 스프링 프레임워크의 장점을 최대한 활용할 수 있습니다. 감사합니다.

'스프링' 카테고리의 다른 글

@RequestParam @PathVariable의 차이  (0) 2019.10.16
@RequestMapping  (0) 2019.10.16
스프링을 사용하는 이유  (0) 2019.03.26
MyBatis란?  (0) 2019.01.17
DI란?  (0) 2019.01.12

JPA는 자바라는 프로그래밍 언어로 데이터베이스와 연결할 수 있는 도구입니다.

데이터베이스란 컴퓨터에 저장된 정보를 관리하는 시스템이고, 자바는 그 정보를 활용하여 웹사이트나 앱을 만드는 언어입니다.

JPA를 사용하면 다음과 같은 장점이 있습니다.

 

  • 쉽고 편리하게 데이터베이스를 다룰 수 있습니다. JPA는 자바의 객체와 데이터베이스의 테이블을 서로 연결해주는 역할을 합니다. 객체란 자바에서 정보와 기능을 묶어놓은 것이고, 테이블은 데이터베이스에서 정보를 정리한 것입니다. JPA가 이들을 연결해주면, 개발자는 복잡한 명령어를 작성하지 않고도 객체를 통해 데이터베이스에 접근하거나 수정할 수 있습니다. 예를 들어, 학생 객체와 학생 테이블을 연결하면, 다음과 같은 코드로 학생의 이름을 바꿀 수 있습니다.
// 학생 객체 생성

Student student = new Student();

// 학생 객체에 이름 설정

student.setName("홍길동");

// JPA가 학생 객체와 학생 테이블을 연결하고, 이름 변경을 데이터베이스에 반영함

entityManager.persist(student);

 

  • 다양한 데이터베이스와 호환됩니다. JPA는 여러 종류의 데이터베이스에 맞게 자동으로 명령어를 바꿔줍니다. 따라서 개발자는 데이터베이스를 변경하더라도 코드를 수정할 필요가 없습니다. 예를 들어, 오라클과 MySQL은 다른 종류의 데이터베이스인데, JPA가 이들에 맞게 명령어를 바꿔주므로, 개발자는 동일한 코드로 두 데이터베이스 모두 사용할 수 있습니다.

 

  • 성능을 향상시킬 수 있습니다. JPA는 데이터베이스와의 통신을 최적화하여 성능을 높여줍니다. 예를 들어, JPA는 캐시라는 기능을 제공하는데, 캐시란 자주 사용하는 정보를 메모리에 저장해두는 것입니다. 캐시를 사용하면, 데이터베이스에 접근하는 시간을 줄일 수 있습니다.
// 첫 번째 조회 시에는 데이터베이스에서 정보를 가져옴

Student student1 = entityManager.find(Student.class, 1L); // id가 1인 학생 객체 조회

// 두 번째 조회 시에는 캐시에서 정보를 가져옴 (데이터베이스 접근 X)

Student student2 = entityManager.find(Student.class, 1L); // id가 1인 학생 객체 조회

 

JPA 위와 같은 장점으로 인해 많은 개발자들에게 사랑받고 있는 기술입니다

JavaScript에서 변수를 선언하는 방법은 크게  가지가 있습니다. var, let, const입니다. 이들 각각의 특성과 사용 방법에 대해 알아보겠습니다.

 

var: 예전에 사용되던 변수 선언 방식

var는 JavaScript에서 변수를 선언할 때 가장 오래된 방식입니다. 이 방식은 이제는 거의 사용되지 않지만, 여전히 일부 브라우저나 라이브러리에서는 이 방식을 사용하기도 합니다.

var 변수를 선언하면해당 변수의 범위(scope) 해당 함수(function) 내에서만 유효합니다함수 안에서 선언한 var 변수는 함수 밖에서는 사용할  없습니다.

 

function test() {
  var a = 10;
  console.log(a);
}

test(); // 10
console.log(a); // Uncaught ReferenceError: a is not defined

 

위 예시 코드에서는 함수 내에서 a라는 변수를 var로 선언하고, 이를 출력하는 코드가 있습니다. 이 코드를 실행하면 10이라는 값이 출력됩니다. 하지만 함수 밖에서는 a라는 변수가 정의되어 있지 않다는 오류가 발생합니다.

 

let: 블록 범위 변수 선언 방식

let ES6에서 새롭게 추가된 변수 선언 방식입니다. 이전의 var와는 달리, let으로 변수를 선언하면 해당 변수의 범위는 블록(block) 단위로 유효합니다. , if, for 등과 같은 블록 내에서 선언된 변수는 해당 블록 안에서만 유효하게 됩니다.

 

function test() {
  if (true) {
    let a = 10;
    console.log(a); // 10
  }
  console.log(a); // Uncaught ReferenceError: a is not defined
}

test();

 

위 예시 코드에서는 if문 내에서 a라는 변수를 let으로 선언하고, 이를 출력하는 코드가 있습니다. 이 코드를 실행하면 10이라는 값이 출력됩니다. 하지만 if문 밖에서는 a라는 변수가 정의되어 있지 않다는 오류가 발생합니다.

 

const: 상수를 선언하는 방식

const let 비슷한 방식으로 변수를 선언하는 방식입니다. 하지만 const 선언된 변수는 정의되면, 다른 값으로 변경할 없습니다. , 상수(constant) 선언할 사용됩니다.

 

const PI = 3.14;
PI = 3.14159; // Uncaught TypeError: Assignment to constant variable.

 

위 예시 코드에서는 PI라는 변수를 const로 선언하고, 이를 다른 값으로 변경하는 코드가 있습니다. 이 코드를 실행하면 TypeError가 발생합니다.

const 선언된 변수는 반드시 선언과 동시에 값을 할당해야 합니다. 또한 const 선언된 객체나 배열은 객체나 배열 자체를 변경할 수는 없지만, 내부의 속성이나 요소는 변경할 있습니다.

 

const person = { name: 'John', age: 30 };
person.age = 31; // 가능
person = { name: 'Jane', age: 25 }; // Uncaught TypeError: Assignment to constant variable.

 

위 예시 코드에서는 person이라는 변수를 const로 선언하고, 이를 변경하는 코드가 있습니다. 객체의 속성은 변경할 수 있지만, 새로운 객체를 할당하려고 하면 TypeError가 발생합니다.

 

정리

  • var: 이제는 거의 사용되지 않는 변수 선언 방식입니다. 기존에 작성된 코드에서는 여전히 사용될 수 있지만, 가능하면 let 또는 const로 대체하는 것이 좋습니다.
  • let: 블록 단위로 유효한 변수를 선언할 때 사용합니다. 이전에는 var를 사용했지만, 이제는 let을 사용하는 것이 좋습니다.
  • const: 한 번 선언된 값을 변경할 필요가 없는 경우, 즉 상수를 선언할 때 사용합니다. 

@PathVariable은 URL경로에 변수를 넣는것 입니다.

 

RESTful API에서 사용합니다. 

 

ex)127.0.0.1:8080/abcd/abcd

 

@RequestParam은 URL 파라미터로 값을 넘기는 방식입니다.

 

ex)127.0.0.1:8080?a=b&c=d

 

'스프링' 카테고리의 다른 글

스프링 트라이앵글  (0) 2023.04.12
@RequestMapping  (0) 2019.10.16
스프링을 사용하는 이유  (0) 2019.03.26
MyBatis란?  (0) 2019.01.17
DI란?  (0) 2019.01.12

+ Recent posts