Coding 공부/MYSQL

[MySQL] MVC, 함수와 프로시저, 형식 지정자, @와 declare, '=' 연산자와 'Like' 연산자, ORM

CBJH 2024. 4. 3.
728x90
반응형

1. MVC란?

 

MVC는 Model-View-Controller의 약자로, 소프트웨어 설계 패턴 중 하나입니다. 이 패턴은 애플리케이션을 세 부분으로 분리하여 개발하는 방식을 말하는데, 각 부분은 다음과 같은 역할을 가집니다:

  • Model (모델): 데이터와 비즈니스 로직을 처리합니다. 애플리케이션의 데이터 구조를 정의하고 데이터베이스의 저장, 조회 등 데이터 관련 로직을 담당합니다.
  • View (뷰): 사용자 인터페이스(UI) 요소를 담당합니다. 사용자가 볼 수 있는 화면을 구성하며, 사용자의 입력을 받아 컨트롤러에 전달합니다.
  • Controller (컨트롤러): 사용자의 입력을 처리하고 모델과 뷰를 연결합니다. 사용자의 입력에 따라 모델을 업데이트하고, 그 결과를 뷰에 반영하여 사용자에게 보여줍니다.

MVC 패턴은 개발 과정을 명확히 분리하여 각 부분의 독립성을 높이고, 유지보수와 확장성을 향상시키는 장점이 있습니다. 웹 애플리케이션뿐만 아니라 다양한 소프트웨어 개발에서 널리 사용되고 있습니다.

 

 

2. SQL에서 함수와 프로시저의 차이점

 

  2.1  목적과 사용 방식

  • 함수(Function): 일반적으로 입력을 받아 처리 후 단일 값을 반환하는 데 사용됩니다. 함수는 SELECT 문 내에서 호출될 수 있으며, 계산이나 데이터 변환 등에 주로 사용됩니다.
  • 프로시저(Procedure): 복잡한 비즈니스 로직을 수행하는 데 사용되며, 하나 이상의 값을 반환하거나 반환 값 없이 여러 작업을 수행할 수 있습니다. 프로시저는 일련의 SQL 문을 포함할 수 있으며, 명령문을 통해 명시적으로 호출해야 합니다.

  2.2  반환 값

  • 함수: 반드시 하나의 값을 반환해야 합니다. 이는 스칼라 값(단일 값)일 수도 있고, 테이블 형태의 결과일 수도 있습니다(테이블 값을 반환하는 함수의 경우).
  • 프로시저: 반환 값이 필수가 아닙니다. 프로시저는 출력 파라미터를 통해 여러 값을 반환할 수 있으며, 결과 집합을 반환할 수도 있습니다.

  2.3  호출 방식

  • 함수: SQL 문 내에서 직접 호출될 수 있습니다. 예를 들어, SELECT, WHERE, HAVING 절 등에서 함수를 사용할 수 있습니다.
  • 프로시저: CALL 문이나 특정 데이터베이스 시스템에 따라 다른 방식(예: EXECUTE)을 사용하여 명시적으로 호출해야 합니다.

  2.4  트랜잭션 관리

  • 함수: 일반적으로 트랜잭션 관리가 제한되어 있습니다. 대부분의 SQL 시스템에서 함수 내에서는 트랜잭션을 시작하거나 종료할 수 없습니다.
  • 프로시저: 트랜잭션을 시작하고, 관리하고, 종료할 수 있는 능력이 있습니다. 이는 프로시저가 복잡한 비즈니스 로직과 데이터 조작을 수행하는 데 적합하게 만듭니다.

요약하자면, 함수는 주로 데이터를 변환하거나 계산하는 데 사용되며 단일 값을 반환하는 반면, 프로시저는 더 복잡한 비즈니스 로직을 수행하고 여러 결과를 반환할 수 있는 더 강력한 도구입니다.

 

 

3. 형식 지정자(format specifier)

 

MySQL에서 날짜와 시간을 형식화하는 데 사용되는 DATE_FORMAT() 함수와 관련된 여러 형식 지정자(format specifier)가 있습니다. 이들은 날짜와 시간 값을 문자열로 변환할 때 특정 부분을 어떻게 표시할지 지정하는 데 사용됩니다. 아래는 주요 형식 지정자들의 설명입니다:

날짜 관련

  • %d: 월 중 일(day of the month)을 두 자릿수로 표시합니다 (00..31).
  • %w: 주 중 일(week day)을 숫자로 표시합니다, 여기서 일요일은 0, 토요일은 6입니다.
  • %W: 주 중 일을 전체 이름으로 표시합니다 (Sunday..Saturday).
  • %y: 연도를 두 자릿수로 표시합니다 (예: 99 또는 23).
  • %Y: 연도를 네 자릿수로 표시합니다 (예: 1999 또는 2023).
  • %m: 월을 두 자릿수로 표시합니다 (01..12).
  • %M: 월을 전체 이름으로 표시합니다 (January..December).

시간 관련

  • %h: 시간을 12시간 형식으로 표시합니다 (01..12).
  • %H: 시간을 24시간 형식으로 표시합니다 (00..23).

사용 예시

SELECT DATE_FORMAT(NOW(), '%W, %M %d, %Y %h:%i:%s %p') AS formatted_date;

이 예시는 현재 날짜와 시간을 "요일, 월 일, 연도 시:분:초 AM/PM" 형식으로 반환합니다. 예를 들어, "Monday, January 01, 2024 08:30:00 PM"과 같은 형태로 결과를 보여줍니다.

 

4. @와 declare 차이점

 

  4.1 @를 사용하는 세션 변수

  • 범위: 세션 변수는 해당 MySQL 세션 동안 어디서나 사용할 수 있으며, 세션 종료 시 사라집니다. 다른 세션에서는 접근할 수 없습니다.
  • 선언 방법: @ 기호를 사용하여 선언하며, 명시적으로 선언할 필요 없이 값을 할당함으로써 자동으로 생성됩니다. 예를 들어, SET @myVariable = 100; 또는 SELECT @myVariable := 100;과 같은 방식으로 사용합니다.
    • SET @myVar = 0;
    • SET @myVar := 0;
    • 하지만 SELECT 문 안에서 변수에 값을 할당할 때는 := 연산자를 사용해야 합니다:이는 =가 SELECT 문 내에서 동등 비교 연산자로 해석될 수 있기 때문에, 할당을 명확하게 나타내기 위해 := 연산자를 사용하는 것입니다.
    • SELECT @myVar := COUNT(*) FROM myTable;
  • 사용 가능한 환경: 세션 변수는 프로시저 내부와 외부 모두에서 사용할 수 있습니다. 이러한 변수는 주로 프로시저나 함수 간에 데이터를 전달하는 데 유용합니다

  4.2 DECLARE를 사용하는 로컬 변수

  • 범위: 로컬 변수는 선언된 특정 블록(예: BEGIN ... END 블록 내) 또는 프로시저 내에서만 유효합니다. 해당 블록이나 프로시저의 실행이 종료되면 변수는 사라집니다.
  • 선언 방법: DECLARE 키워드를 사용하여 명시적으로 선언해야 합니다. 이 변수는 오로지 프로시저나 함수 내부에서만 선언될 수 있습니다. 예를 들어, DECLARE myVariable INT DEFAULT 100;와 같이 선언할 수 있습니다.
  • 사용 가능한 환경: 로컬 변수는 오직 스토어드 프로시저나 함수 내에서만 선언하고 사용할 수 있습니다. 이들은 주로 프로시저 내부의 로직 처리에 사용됩니다.

  4.3 요약

  • @를 사용하는 세션 변수는 프로시저나 세션 전체에서 사용할 수 있는 보다 유연한 변수이며, 명시적인 선언 없이도 사용할 수 있습니다.
  • DECLARE를 사용하는 로컬 변수는 좀 더 제한적인 스코프를 가지며, 스토어드 프로시저나 함수 내부에서만 사용됩니다. 이들은 특정 코드 블록의 로직을 위해 존재하며, 그 범위를 벗어나면 소멸합니다.

 

5.  '=' 연산자와 'Like' 연산자의 차이점

5.1  =

  • = 연산자는 값이 정확히 일치하는 경우에 사용됩니다.
  • 이 연산자는 대소문자를 구분하는 데이터베이스에서는 대소문자가 정확히 일치해야 매치되며, 대소문자를 구분하지 않는 데이터베이스에서는 대소문자와 무관하게 일치합니다.
  • 예를 들어, SELECT * FROM users WHERE username = 'john'은 username이 정확히 'john'인 행만 반환합니다.

5.2  LIKE

  • LIKE 연산자는 패턴 매칭을 사용하여 데이터를 조회할 때 사용됩니다. 특히 %와 _와 같은 와일드카드 문자와 함께 사용되어, 부분적인 일치나 특정 패턴을 찾는 데 유용합니다.
    • %는 0개 이상의 문자를 대체할 수 있습니다.
    • _는 정확히 하나의 문자를 대체합니다.
  • 예를 들어, SELECT * FROM users WHERE username LIKE 'jo%'는 username이 'jo'로 시작하는 모든 행을 반환합니다.
  • LIKE 연산자는 대개 대소문자를 구분하지 않지만, 이는 데이터베이스의 설정에 따라 다를 수 있습니다.

요약

  • =는 정확한 일치를 찾을 때 사용되며, LIKE는 패턴이나 부분적인 일치를 찾을 때 사용됩니다.
  • LIKE는 와일드카드를 사용하여 더 유연한 검색 조건을 제공할 수 있습니다, 반면 =는 와일드카드를 사용할 수 없습니다.

 

6. ORM

 

ORM (Object-Relational Mapping)은 객체 지향 프로그래밍 언어를 사용하여 호환되지 않는 유형의 시스템 간에 데이터를 변환하는 프로그래밍 기술입니다. 간단히 말해서, ORM은 데이터베이스의 테이블을 클래스로 매핑하고, 테이블의 레코드를 해당 클래스의 인스턴스(객체)로 매핑함으로써, 개발자가 객체 지향 언어에서 데이터베이스를 더 쉽고 직관적으로 다룰 수 있게 해줍니다. 이러한 접근 방식은 데이터베이스 작업을 보다 객체 지향적인 방식으로 수행할 수 있게 해주며, SQL 쿼리를 직접 작성하는 대신 객체와 그들의 관계를 사용하여 데이터에 접근할 수 있게 합니다.

  6.1 ORM의 주요 장점:

  1. 생산성과 속도: ORM을 사용하면 반복적이고 지루한 CRUD (생성, 읽기, 업데이트, 삭제) 작업을 빠르게 처리할 수 있습니다.
  2. 유지보수성: 데이터 모델을 변경할 때 SQL 쿼리를 일일이 수정하는 대신, 클래스의 코드만 변경하면 ORM이 나머지를 처리합니다.
  3. 보안: SQL 쿼리를 직접 작성할 때 발생할 수 있는 SQL 인젝션 같은 보안 취약점을 ORM이 자동으로 처리해 줄 수 있습니다.
  4. 데이터베이스 독립성: 적절한 ORM 사용은 애플리케이션 코드를 특정 데이터베이스 구현에 덜 종속적으로 만들어 줍니다. 이는 다른 데이터베이스로의 이동이나 다양한 데이터베이스 지원이 필요할 때 유리합니다.

  6.2 ORM의 단점:

  1. 성능: ORM을 사용하면 복잡한 쿼리나 최적화가 필요한 고성능 애플리케이션의 경우, 직접 작성한 SQL보다 성능이 떨어질 수 있습니다.
  2. 학습 곡선: ORM을 효과적으로 사용하기 위해서는 해당 ORM의 작동 방식과 객체 지향 설계에 대한 이해가 필요합니다.
  3. 복잡성: 매우 복잡한 쿼리나 특수한 데이터베이스 기능을 사용해야 하는 경우, ORM을 사용하는 것이 오히려 더 복잡할 수 있습니다.

대표적인 ORM 라이브러리로는 Java의 Hibernate, Python의 SQLAlchemy 및 Django ORM, Ruby의 ActiveRecord (Rails의 일부), .NET의 Entity Framework 등이 있습니다. 이러한 도구들은 각기 다른 프로그래밍 언어 환경에서 데이터베이스 작업을 보다 쉽게 할 수 있도록 설계되었습니다.

 

댓글