1. 우선적으로 root page로 설정하고자 하는 파일 경로 및 Path 를 생성합니다.

예 [/home/dev/web_root/]

$mkdir /home/dev/web_root

 

2. 아파치 웹서버의 설정파일을 수정합니다.

$sudo vim /etc/apache2/apache2.conf

# 기존 입력 되어 있는 Directory 하단에 새로 추가합니다.
<Directory />

        Options FollowSymLinks

        AllowOverride None

        Require all denied

</Directory>


# 새로 추가한 부분입니다.
<Directory /home/dev/web_root>

        Options Indexes FollowSymLinks

        AllowOverride None

        Require all granted

</Directory>

3. a2enmod 명령어를 통하여, 하기의 모드들을 활성화 합니다.

$sudo a2enmod rewrite

$sudo a2enmod proxy

$sudo a2enmod proxy_http

 

4. 하기의 명령어를 통하여, config 파일을 복사 및 수정합니다.

$sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/001-dev_web.conf

$sudo vim /etc/apache2/sites-available/001-dev_web.conf

<VirtualHost *:7070>

        ServerName localhost

        ErrorLog /home/dev/web_root/error.log

        CustomLog /home/dev/web_root/access.log combined

        DocumentRoot /home/dev/web_root

        <Directory /home/dev/web_root>

            Options Indexes FollowSymLinks MultiViews

            AllowOverride ALL

        </Directory>

 

</VirtualHost>

만약 외부 아이피로 설정하고 싶으시다면 localhost대신 ip를 입력하시면 됩니다.

VirtualHost *:7070 부분이 있는데 7070 은 사용할 포트 입니다. 

사용하시고자 하는 Port로 변경하시면 됩니다.

(관련 내용은 blog.embian.com/46 사이트 에서 참고하시면 좋으실 것 같습니다.)

 

5. a2ensite명령어를 이용하여, 해당 config 활성화 합니다.

$sudo a2ensite /etc/apache2/sites-available/001-dev_web.conf

위의 명령어를 입력하면, /etc/apache2/sites-enabled/ 에서 해당 파일이 link 되어 있는 것을 확인할 수 있습니다.

 

6. Apache2 에서 추가된 Port 추가합니다.

$sudo vim /etc/apache2/ports.conf

Listen 80
# 위의 Listen 80 하단에 001-dev_web 에서 추가한 Port를 추가합니다.
Listen 7070

7. 위와 같이 설정 이 끝나면, apach2 서비스를 재시작하시면 됩니다.

$sudo service apache2 restart

 

감사합니다.

'WebProgramming' 카테고리의 다른 글

Web Server 구축  (0) 2020.12.10

안녕하세요 이번에 Web 관련하여 일을 진행하게 되어, 조금씩 정리하여 올리고자 이렇게 글을 올리게 되었습니다.

 

Ubuntu 환경에서 구축을 하시게 되면, 다른 분들도 참고하시길 바라겠습니다.

 

절차

1. Apache2 설치.

2. MySQL 설치.

3. JSP 또는 PHP 설치.

4. 기타

 

저는 우분투 18.04 환경에서 구축하였습니다.

 

설치 방법은 명령어 방식으로 설명을 하도록 하겠습니다.

1. Apache2 설치.

$ sudo apt-get install apache2

 

2. MySql 설치

$ sudo apt install mysql-server

설치 완료 후, 보안 초기 설정을 해주셔야 합니다.

하기의 명령어 실행합니다.

$ sudo mysql_secure_installation  
============================================
Press y|Y for Yes, any other key for No: y

// 하기의 내용은 암호 생성 보안 순의를 말합니다.
Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 1
 
New password: [사용할 암호 입력]
 
//설정한 비밀번호를 사용할 것인지 여부입니다.
Do you wish to continue with the password provided?
(Press y|Y for Yes, any other key for No) : y
 
//익명의 사용자를 삭제할 지에 대하여 문의 하는 것입니다.
Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
 
//원격 접속을 허용할지 말지를 뜻합니다. Localhost가 아닌 다른 외부 아이피로 부터 접근을 가능하게 한다고 한다면, Y를 누르시면 됩니다.
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
 
// Test용도의 Database를 삭제할 지를 뜻합니다.
Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y

// 위와 같이 변경하였다면, y를 눌러서 다시 db를 로드하도록 합니다.
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y

 

3. JSP 또는 PHP 설치. (저는 PHP 설치 기준으로 설명 드리겠습니다.)

$ sudo apt install php php-mysql

 

4. 기타

Apache2 구동

$ sudo service apache2 restart // 재시작
$ sudo service apache2 start   // 시작
$ sudo service apache2 stop    // 멈춤

 

MySql 사용자 추가

$ sudo mysql

하기의 create user 명령어 입력 합니다.. (작은 따음표(') 를 포함하여 입력합니다.)

> create user '사용자'@'localhost' identified by '비밀번호';

다음의 명령어를 통하여, 사용자의 DB 권한 부여를 합니다. (작은 따음표(') 를 포함하여 입력합니다.)

>grant all privileges on *.* to '사용자'@'localhost';

만약 일부 DB만 권한을 주고 싶다면 다음과 같이 입력하면 됩니다.

>grant all privileges on DB이름.* to '사용자'@'localhost';

사용자 계정을 삭제하고 싶다면 하기의 명령어를 입력합니다. (작은 따음표(') 를 포함하여 입력합니다.)

$ drop user '사용자'@'localhost';

원격에서 접속 가능한 사용자를 지정하고 싶다면, localhost대신 IP 를 입력하시면 됩니다.

(저는 로컬에서만 작업을 진행을 할 것이라, localhost로 입력하였습니다.)

 

phpmyadmin 설치 (Web 상으로 MySql DB를 관리할 수 있는 툴)

$ sudo apt install phpmyadmin

1. phpmyadmin 설치 도중, phpmyadmin의 데이터 베이스를 dbconfig-common으로 설정할 것인지에 대해서 팝업이 발생합니다. 이때 yes를 눌러주시면 됩니다.

2. MySql을 사용할 것인지 문의 하는 팝업이 나오면, MySql을 설치하였기 때문에 MySql을 선택하시면 됩니다.

3. phpmyadmin에서 MySql 에 등록할 암호를 입력하라고 팝업이 나오면, 암호를 입력하시면 됩니다.

설치 완료 후, apache2 에서 일부 명령어를 추가합니다.

$sudo vim /etc/apache2/apache2.conf

apache2.conf 파일을 열어서, 하기의 내용 추가합니다.
Include /etc/phpmyadmin/apache.conf

파일을 저장 후, 에디트 모드에서 나갑니다.

Apache2 서비스를 재시작 합니다.
$sudo service apache2 restart

http://localhost/phpmyadmin 로 접속하여, 동작 확인하면 됩니다.

부족한 부분이 많이 있겠지만 잘 부탁드리겠습니다.

 

감사합니다.

열거 클래스는 다음과 같이 선언하여, 사용할 수 있다.

또한 기본으로 다음과 같은 멤버 및 멤버 함수를 가지고 있다.

 

val name:String

val ordinal:Int

fun valueOf(value:String): 열거 클래스

fun values():Array<열거 클래스>

 

여기서 name 은 열거 클래스에서 작성한 문자열 그대로 표기되며, 또한 ordinal은 첫번째 열거 부터 시작하여, 0 에서 시작하고 해당 열거 부분의 Index 값을 가지고 있다.

enum class Mode
{
	SELECTION, PEN, SHAPE, ERASER
}

fun main(args: Array<String>)
{
	// 현재 선택된 모드
	val mode: Mode = Mode.PEN

	when (mode)
	{
		Mode.SELECTION -> println("선택 모드")
		Mode.PEN -> println("펜 모드")
		Mode.SHAPE -> println("도형 모드")
		Mode.ERASER -> println("지우개 모드")
	}
}

열거 클래스에 프로퍼티와 멤버 함수 선언하는 방법

enum class Mode(val number: Int)
{
	SELECTION(0),
	PEN(1),
	SHAPE(2),
	ERASER(3);

	fun printNumber()
	{
		println("모드: $number")
	}
}

fun main(args: Array<String>)
{
	// 현재 선택된 모드
	val mode: Mode = Mode.ERASER

	println(mode.number)
	mode.printNumber()
}

참고 : 초보자를 위한 Kotlin 200제 라는 책을 기반으로 공부 내용을 정리하였습니다

배열 함수는 다음과 같이 정의 되어 있다.

class Array<T>

{

  val size:Int

  operator fun get(index:Int):T

  operator fun set(index:Int, value:T):Unit

  operator fun iterator():Iterator<T>

}

배열을 생성할 시, arrayOf 라는 함수를 사용하여, 생성하면 된다.

fun main(args: Array<String>)
{
	val integers: Array<Int> = arrayOf(10, 20, 30, 40)

	println(integers.size)
	println(integers[1])

	for (i in integers)
		print("$i ")
}

배열을 가변 인수로 활용하는 방법은 아래의 예제와 같이 vararg 로 선언하여, 사용하면 되며, 

또한 함수 인수를 전달 할 시에는 *를 사용하여, 전달하면 된다.

fun printAll(vararg tokens: String)
{
	for (token in tokens)
		print("$token ")
}

fun main(args: Array<String>)
{
	val numbers: Array<String> = arrayOf("What's", "your", "name?")
	printAll(*numbers)
}

 

참고 : 초보자를 위한 Kotlin 200제 라는 책을 기반으로 공부 내용을 정리하였습니다

in/out 키워드는 타입 매개변수의 업 및 다운 캐스팅을 할 수 있도록 지원되는 키워드이다.

out : AAA<서브 타입>을 AAA<Super 타입>에 대입할 수 있도록 지원.

in : AAA<Super 타입>을 AAA<서브 타입>에 대입할 수 있도록 지원.

* : AAA<*> 은 타입 인수가 무엇이든 상관없이 대입 할 수 있도록 지원.

class AAA<out T>

class BBB<in T>

fun main(args: Array<String>)
{
	val aaaSub = AAA<Int>()
	val aaaSuper: AAA<Any> = aaaSub

	val bbbSuper = BBB<Any>()
	val bbbSub: BBB<Int> = bbbSuper

	val star: AAA<*> = aaaSub
}

.. 연산자는 범위를 표현하는 연산자 이다.

.. 연산자는 operator fun rangeTo 라는 함수로 치환된다.

만약 클래스를 정의 하고 하고 싶을 경우, operator fun rangeTo 라는 함수를 오버라이딩하면 된다.

fun main(args: Array<String>)
{
	val oneToTen: IntRange = 1..10
	println(5 in oneToTen)

	val upperAtoZ: CharRange = 'A'..'Z'
	if ('C' in upperAtoZ)
		println("대문자입니다.")

	if ('p' in 'a'..'z')
		println("소문자입니다.")
}

 

 

참고 : 초보자를 위한 Kotlin 200제 라는 책을 기반으로 공부 내용을 정리하였습니다

타입 매개 변수는 대부분의 상황에서 일반 타입 처럼 사용할 수 있으나, 특정 상황에서는 불가능 하다.

예를 들면 is 키워드가 그렇다.

만약 is 키워드를 사용하고 싶다면, fun 앞에 inline을 붙여주어야 하며, 타입 매개 변수 앞에는 reified 키워드를 붙여주어야 한다.

inline fun <reified T> check()
{
	val number = 0
	if (number is T)
		println("T는 Int 타입 입니다.")
}

fun main(args: Array<String>)
{
	check<Int>()
}

참고 : 초보자를 위한 Kotlin 200제 라는 책을 기반으로 공부 내용을 정리하였습니다

함수 리터럴 : (Int)->Unit 은 매개변수가 Int타입이고, 반환타입이 Unit인 함수를 저장할 수 있는 타입을 뜻함.

람다식 : {매개변수 -> 반환 값} 형태를 이야기 함.

fun main(args: Array<String>)
{
	val instantFunc: (Int) -> Unit
	instantFunc = { number: Int ->
		println("Hello $number")
	}

	instantFunc(33)
	instantFunc.invoke(33)
}

위의 예제 코드에서 .invoke라는 함수가 있는데, 함수 타입의 변수를 해당 함수를 통하여, 호출해도 된다.

 

익명 함수 : 람다 식으로 표기된 함수 리터럴을 함수 이름이 없는 함수로 다르게 표현할 수 있다. 이를 익명함수라 한다. 

                fun{value type}:{return type}

fun main(args: Array<String>)
{
	val instantFunc: (Int) -> Unit
	instantFunc = fun(number: Int): Unit
	{
		println("Hello $number")
	}

	instantFunc(33)
	instantFunc.invoke(33)
}

it 식별자 : 람다식의 매개 변수가 하나일 경우, 매개 변수 선언을 생략할 수 있다. 그리고 그 매개 변수를 사용하고 싶을 때 사용되는 키워드이다.

fun main(args: Array<String>)
{
	val instantFunc: (Int) -> Unit = {
		println("Hello $it")
	}

	instantFunc(33)
}

 

참고 : 초보자를 위한 Kotlin 200제 라는 책을 기반으로 공부 내용을 정리하였습니다

sealed 키워드는 자신의 중첩 클래스에 한해서만 상속을 허용하는 키워드이다.

해당 내용에 대한 예제 코드는 다음과 같다.

sealed class Outer
{
  class One : Outer()
  class Two : Outer()
  class Three : Outer()
}

fun main(args: Array<String>)
{
  val instance: Outer = Outer.Three()

  val text: String = when (instance)
  {
    is Outer.One -> "One"
    is Outer.Two -> "Two"
    is Outer.Three -> "Three"
  }

  println(text)
}

참고 : 초보자를 위한 Kotlin 200제 라는 책을 기반으로 공부 내용을 정리하였습니다.

확장 함수란 문법은 상속 없이 클래스 외부에서 멤버 함수를 추가할 수 있는 문법을 뜻한다.

아래의 예제에서는 String 클래스에서 isNumber이라는 기존에 정의되어 있지 않은 함수를 확장 함수 문법을 통하여, 추가한 것이다.

fun String.isNumber(): Boolean
{
  var i = 0
  while (i < this.length)
  {
    if (!('0' <= this[i] && this[i] <= '9'))
    return false
    i += 1
  }
  return true
}

fun main(args: Array<String>)
{
  println("1234567890".isNumber())
}

그리고 확장 프로퍼티는 함수가 아닌 Property를 확장하는 것이다.

아래의 예제 코드를 참고하면 되겠다.

val String.isNumber: Boolean
  get()
  {
    var i = 0
    while (i < this.length)
    {
      if (!('0' <= this[i] && this[i] <= '9'))
      return false
      i += 1
    }
    return true
  }

fun main(args: Array<String>)
{
  println("1234567890".isNumber)
}

참고 : 초보자를 위한 Kotlin 200제 라는 책을 기반으로 공부 내용을 정리하였습니다.

'Kotlin' 카테고리의 다른 글

[Kotlin] 함수 리터럴과 람다식, 익명함수, it 식별자  (0) 2020.09.06
[Kotlin] Sealed Class  (0) 2020.09.01
[Kotlin] is 연산자  (0) 2020.09.01
[Kotlin] Nothing type, Nullable, null  (0) 2020.08.31
[Kotlin] Class  (0) 2020.08.29

+ Recent posts