#Web서버란

HTTP를 통해 웹브라우저에서 요청하는 정적 웹페이지(HTML)를 응답해주는 서비스 프로그램(소프트웨어)

HTTP란 HyperTextTransferProtocol의 약자로 www상에서 사용하는 프로토콜(메세지를 주고 받는 체계)이다

 

#HTTP

 

developer.mozilla.org/ko/docs/Web/HTTP/Overview#http_%EA%B8%B0%EB%B0%98_%EC%8B%9C%EC%8A%A4%ED%85%9C%EC%9D%98_%EA%B5%AC%EC%84%B1%EC%9A%94%EC%86%8C

 

#Web서버와 클라이언트(사용자) 간에 주고 받는 방식

Web서버와 클라이언트(사용자) 간에 주고 받는 방식은 기본적으로 HTTP라는 프로토콜을 사용한다

클라이언트에서 웹서버에 요청하는 것을Request(요청) 이라고 하며

웹서버에서 클라이언트에 응답하는 것을 Response(응답) 이라고 한다

 

기본적으로 web서버와 클라이언트 간에 주고 받는 방식은  Request(요청)Response(응답) 2가지로 성립된다 

 

 Request(요청)

Response(응답)

 

#HTTP 메서드에는 GET, POST가 있으며 서버가 요청을 수행하기 위해 해야할 행동을 표시한다

 

#GET (서버로부터 정보를 검색하기 위해 설계된 메서드)
Body에 전송할 데이터를 담지않고
쿼리스트링(주소줄 뒤에 ?변수 &변수 &변수 방식)으로 이어붙여서 값을 전달한다

(처음엔 ?로 시작하고 두번째 변수부터는 &으로 시작한다)

Ex) www.example-url.com/resources?변수명1=변수값&변수명2=변수값

길이제한이 있기 때문에 많은 양을 전달하기에는 부적합하며
주소에 정보가 노출되기 때문에 보안에 취약 

 

#POST(리소스를 등록/갱신 하기위해 설계된 메서드)
전송할 데이터를 Body에 담아서 전송(form태그 등)

길이제한 없음
주소줄에 정보가 보이지 않아 get보다 안전하기만
주소줄에 보이지 않을뿐 통신을 도청 가능하기 때문에 암호화 권장

 

비동기 식에도 사용법은 동일하게 적용된다

 

#그 외

브라우저의 북마크를 등록할경우 URL을 열때 GET방식으로 열린다

POST방식의 경우 결과를 Body에 담기 때문에 검색결과를 북마크 할 수 없다 

 

 

ASP에는 3가지 페이지 이동 메서드가 존재한다

 

#server.Execute("파일명.ASP", 개체명) 

특정페이지를 함수처럼 사용하고
다시 원래 페이지로 돌아옴

 

#server.transfer("파일명.ASP")  : 주소(URL)는 그대로, 결과만 반환

JSP의 forward와 비슷하다

 

1. 주소값을 가지고 같은 서버내에서 asp페이지에 이동을 하고 결과를 클라이언트에게 보냄

(덕분에 redirect보다 속도가 빠름, 그러나 서버에서 처리되고 클라이언트는 기록이 없기 때문에 뒤로가기 불가)

 

2. 그렇기 때문에 URL변화 없음, 쿼리문자열과 폼에 존재하는 변수도 유지됨

request, response가 유지됨(객체 재사용 가능)

(get방식 사용불가, 변수 넘기기 불가, get방식은 전송후 URL이 변하기 때문에)

 

3. 같은서버 내에서 처리하기 때문에 외부 페이지에 이동할 수 없고, 서버 내의 asp페이지 내에서만 이동 가능

server.transfer는 JSP로 forward랑 비슷하다 보면 된다

 

동작방식

1.브라우저에서 서버에 요청(request)

2.서버가 응답(response), 요청된 주소를 따라 "같은서버 내에서 해당 주소로 이동" 후 결과를 브라우저에 반환

3.브라우저는 결과를 표시함

 

#response.redirect("파일명.ASP", FALSE) : 주소(URL)와 결과를 반환

 

1. 서버에서 주소값을 클라이언트로 보내서 클라이언트가 받은 주소로 페이지를 찾아감

(transfer에 비해 작업이 늘기 때문에 속도는 떨어짐)

 

2. 클라이언트 쪽에서 이동하기 때문에 같은서버 내의 페이지 뿐만아니라

외부 서버 페이지에 이동도 가능(클라이언트에 기록이 있기 때문에 뒤로가기 가능)


3. URL이 변화 있기 때문에 유저가 갱신된 URL을 볼 수 있다.

request, response객체가 새롭게 생성 됨(객체 재사용 불가)

post, get방식 사용가능, get변수 넘기기 가능

 

동작방식

1.브라우저에서 서버에 요청(request)

2.서버가 응답(response), 다른페이지로 이동하라고 주소를 브라우저에 보냄

3.브라우저는 받은 주소로 이동

4.브라우저는 결과를 표시함

 

 

#가장 많이 사용되는 transfer(forward)와 redirect의 차이를 요약

transfer(forward)는 서버가 주소로 이동해서 얻은 결과를 브라우저에 반환(URL 그대로, 객체(변수) 그대로)

redirect는 서버가 주소를 브라우저에 주면 브라우저가 이동해서 결과를 얻음(URL바뀜, 객체(변수) 새로 생성됨)

 

transfer(forward)는 객체가 유지되기 때문에 DB에 변화가 없는 검색, 리스트와 같은 SELECT처리에 적합하고

redirect는 객체가 새로 생성되기 때문에 글쓰기, 수정, 삭제와 같은 INSERT, UPDATE, DELETE처리에 적합하다

 

transfer(forward)는 객체가 유지되기 때문에 새로고침을 하면 글쓰기가 2번 등록되거나 함

'Programming > C#' 카테고리의 다른 글

[C#] 확장 메서드  (0) 2020.12.23
[C#] MSSQL 연결 후 SQL 실행  (0) 2020.12.23
[C#] 접근제한자  (0) 2020.12.18
[C#] namespace란  (0) 2020.12.18
[C#] abstract, interface, virtual  (0) 2020.12.18

#확장 메서드란

기존에 있던 클래스에 메서드를 추가하는 것이다

새로운 클래스를 만들어서 메서드를 추가해도 되지만

string과 같이 기존에 존재하는 클래스의 이름을 활용하기 위함이다

 

예를들면 string클래스에는 Length, Split, Trim, Toint32과 같은 메서드가 존재한다

하지만 공백제거와 숫자로 변환하는 Trim과 Toint32를 동시에 처리해주는 메서드는 존재하지 않는다

 

라이브러리 클래스를 만들어서 기능메서드를 호출하는 방법과는 조금 다른데 아래에서 설명

 

#확장 메서드를 만드는 방법에는 규칙이 있다

public static 클래스 안에서 public static 메서드로 선언해야한다

    //string에 메서드를 추가
    public static class StringExtensions
    {
        public static int ToNumber(this string str)
        {
            str.Trim();
            return Convert.ToInt32(str);
        }
    }

 

ToNumber(this string str)에서 this는 확장할 클래스를 뜻하며 

this string은 string 클래스를 확장하겠다는 의미이다

그리고 공백제거 후 int형으로 변환해서 반환하고 있다

 

다른 클래스에서 공백제거 후 int변환을 사용한다면

클래스 객체 생성후 메서드에 접근해야하지만

확장메서드를 사용하면 아래와 같이 string에서 바로 접근이 가능하다

string str = "12     3";
str.ToNumber();//결과 : 123

 

 

'Programming > C#' 카테고리의 다른 글

[C#] Web서버란  (0) 2021.01.01
[C#] MSSQL 연결 후 SQL 실행  (0) 2020.12.23
[C#] 접근제한자  (0) 2020.12.18
[C#] namespace란  (0) 2020.12.18
[C#] abstract, interface, virtual  (0) 2020.12.18

1. App.config에서 아래 코드를 작성

 

  <connectionStrings>
    <add name="객체이름" 
         connectionString="
         Data Source =사용할 서버 이름;
         Initial Catalog=사용할 서버 안에 있는 DB이름;
         User ID=DB에 로그인할 ID; //sql server인증
         Password=DB에 로그인할 비밀번호" //sql server인증
         Integrated Security=true;/> //윈도우 인증의 경우 위 UserId와 Password는 필요없음
  </connectionStrings>

 

필자의 경우 윈도우 인증이기 때문에 아래처럼 작성했다

  <connectionStrings>
    <add name="TestDB" --객체 명
         connectionString="
         Data Source =PLONE; --서버 이름
         Initial Catalog=MYDB; --DB이름
         Integrated Security=true;"/> --윈도우 인증
  </connectionStrings>

 

2. 클래스파일로 돌아와서 최상단에 아래 코드를 using

using System.Data.SqlClient;
using System.Configuration;

 

3.SELECT문 : SELECT 결과를 Bean에 집어넣은 다음 리스트에 추가 후 반환

        public List<BoardBean> selectBoard()
        {
            //DB접속 문자열 취득
            string connectionString = ConfigurationManager.ConnectionStrings["TestDB"].ConnectionString;//App.config에서 작성한 DB정보
            List<BoardBean> list = new List<BoardBean>();

            using (SqlConnection connection = new SqlConnection(connectionString))
            using (SqlCommand command = connection.CreateCommand()) //커맨드 생성
            {
                try
                {
                    //DB에 접속
                    connection.Open();
                    
                    //SQL 준비
                    command.CommandText = @"SELECT * 
                                        FROM examsite 
                                        WHERE boardId = @boardID";//커맨드 입력
                    //파라메터 정의
                    command.Parameters.AddWithValue("@boardId", "free");

                    using (SqlDataReader reader = command.ExecuteReader())//다중 레코드를 반환하는 쿼리
                    {
                        while (reader.Read() == true)//다음 레코드를 읽음, 레코드가 존재하지 않을때까지 반복
                        {
                            BoardBean bean = new BoardBean();//빈 생성
                            bean.BoardNum = Convert.ToInt32(reader["boardNum"]);//빈에 정보 입력
                            bean.BoardId = reader["boardId"] as string;
                            list.Add(bean);//리스트에 추가
                        }
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine("Error : " + e);
                    throw;
                }
            }

            return list;
        }

 

command.CommandText = @"SELECT 의 @의 의미는 

개행을 하더라도 ""+""을 하지않아도 된다

string str = "SELECT *" +
             "FROM TABLE";
             
string str = @"SELECT *
               FROM TABLE";

 

 

4. INSERT, DELETE, UPDATE : 3개의 알고리즘은 동일하다

        public int insertBoard()
        {
            //DB접속 문자열 취득
            string connectionString = ConfigurationManager.ConnectionStrings["TestDB"].ConnectionString;//App.config에서 작성한 DB정보
            int resultCount = 0;

            using (SqlConnection connection = new SqlConnection(connectionString))
            using (SqlCommand command = connection.CreateCommand()) //커맨드 생성
            {
                try
                {
                    //DB에 접속
                    connection.Open();
                    
                    //SQL 준비
                    command.CommandText = @"INSERT INTO EXAMSITE(
                                        boardNum,
                                        boardId)
                                        VALUES(
                                        @boardNum,
                                        @boardId)";//커맨드 입력
                    //파라메터 정의
                    command.Parameters.AddWithValue("@boardNum", 10);
                    command.Parameters.AddWithValue("@boardId", "free");

                    //SQL 실행,실행된 행의 수를 반환
                    resultCount = command.ExecuteNonQuery();
                }
                catch (Exception e)
                {
                    Console.WriteLine("Error : " + e);
                    throw;
                }
            }

            return resultCount;
        }

 

 

또한 Command.CommandText를 사용하지 않고 아래처럼 사용가능하다

다만 이 방법은 SQL과 변수 설정이 떨어져 있어서 가독성이 나빠진다

        public int deleteBoard()
        {
            //DB접속 문자열 취득
            string connectionString = ConfigurationManager.ConnectionStrings["TestDB"].ConnectionString;//App.config에서 작성한 DB정보
            int resultCount = 0;

            //SQL 준비
            string sql = @"DELETE FROM EXAMSITE
                           WHERE boardNum = @boardNum";

            using (SqlConnection connection = new SqlConnection(connectionString))
            {

                try
                {
                    //DB에 접속
                    connection.Open();
                    SqlCommand command = new SqlCommand(sql, connection);

                    //파라메터 정의
                    command.Parameters.AddWithValue("@boardNum", 10);

                    //SQL 실행,실행된 행의 수를 반환
                    resultCount = command.ExecuteNonQuery();
                }
                catch (Exception e)
                {
                    Console.WriteLine("Error : " + e);
                    throw;
                }
            }

            return resultCount;
        }

 

 

5. 2개 이상의 SQL을 작업하는 경우 : 트랜잭션 사용

        public void TranTest()
        {
            //DB접속 문자열 취득
            string connectionString = ConfigurationManager.ConnectionStrings["TestDB"].ConnectionString;//App.config에서 작성한 DB정보

            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                try
                {
                    //DB에 접속
                    connection.Open();

                    using (SqlTransaction transaction = connection.BeginTransaction())
                    using (SqlCommand command = new SqlCommand() { Connection = connection, Transaction = transaction })
                    {
                        //SQL 준비
                        command.CommandText = @"INSERT INTO EXAMSITE(
                                        boardNum,
                                        boardId)
                                        VALUES(
                                        @boardNum,
                                        @boardId)";//커맨드 입력
                                                   //파라메터 정의
                        command.Parameters.AddWithValue("@boardNum", 10);
                        command.Parameters.AddWithValue("@boardId", "free");

                        //SQL 실행,실행된 행의 수를 반환
                        command.ExecuteNonQuery();

                        //SQL 준비
                        command.CommandText = @"INSERT INTO EXAMSITE(
                                        boardNum,
                                        boardId)
                                        VALUES(
                                        @boardNum,
                                        @boardId)";//커맨드 입력
                                                   //파라메터 정의
                        command.Parameters.AddWithValue("@boardNum", 11);
                        command.Parameters.AddWithValue("@boardId", "free");

                        //SQL 실행,실행된 행의 수를 반환
                        command.ExecuteNonQuery();
                    }

                }
                catch (Exception e)
                {
                    Console.WriteLine("Error : " + e);
                    throw;
                }
            }
        }

'Programming > C#' 카테고리의 다른 글

[C#] Web서버란  (0) 2021.01.01
[C#] 확장 메서드  (0) 2020.12.23
[C#] 접근제한자  (0) 2020.12.18
[C#] namespace란  (0) 2020.12.18
[C#] abstract, interface, virtual  (0) 2020.12.18

접근제한자는 클래스, 함수 가장 앞에 선언되며

C#은 접근제한자가 4개 존재한다

명시하지 않으면 internal이 기본이다

 

  • public : 제약없이 어느곳에서 접근가능
  • private : 선언한 해당 클래스 내에서만 접근가능(클래스에 선언 불가)
  • protected : 선언한 클래스 및 상속받은 자식 클래스에서만 접근가능(클래스에 선언 불가)
  • internal : 해당 프로젝트 내에서만 접근가능(아무것도 명시하지 않으면 internal이 기본)

 

'Programming > C#' 카테고리의 다른 글

[C#] 확장 메서드  (0) 2020.12.23
[C#] MSSQL 연결 후 SQL 실행  (0) 2020.12.23
[C#] namespace란  (0) 2020.12.18
[C#] abstract, interface, virtual  (0) 2020.12.18
[C#] is, as 연산자  (0) 2020.12.17

docs.microsoft.com/ko-kr/dotnet/csharp/language-reference/language-specification/namespaces

 

Namespaces - C# language specification

네임스페이스Namespaces 이 문서의 내용 --> C# 프로그램은 네임 스페이스를 사용 하 여 구성 됩니다.C# programs are organized using namespaces. "External" 조직의 시스템 및 프로그램에 대 한 "내부" 조직 시스템

docs.microsoft.com

 

C#에서 namespace는 java의 package와 비슷한 개념이다

 

이름은 자바와 같이 .로 구분하며

 

자바는 패키지 안에 여러 클래스가 존재하면

C#은 네임스페이스 안에 여러 클래스가 존재한다

 

JAVA

package 패키지명;

class 클래스명{

}

C#

namespcae 네임스페이스명
{
    class 클래스명
    {
    }

}

 

 

다른 패키지(네임스페이스)에서 가져와 쓰는 방법도 동일하다

using Study2; //using 다른 네임스페이스 이름

namespace study
{
    class 클래스명
    {
        Study2.Cat cat2 = new Study2.Cat();
    }
}

 

 

네임스페이스 안에는 하위 네임스페이스를 작성할 수 있다

아래 2개의 코드는 같은 코드이다

namespace study1.study2
{
    class A
    {
    }
}



namespace study1
{
    namespace studt2
    {
        class A
        {
        }
    }
}

 

'Programming > C#' 카테고리의 다른 글

[C#] 확장 메서드  (0) 2020.12.23
[C#] MSSQL 연결 후 SQL 실행  (0) 2020.12.23
[C#] 접근제한자  (0) 2020.12.18
[C#] abstract, interface, virtual  (0) 2020.12.18
[C#] is, as 연산자  (0) 2020.12.17

+ Recent posts