https://just-coding-room.tistory.com/51

[Tomcat] error.do 무한 리다이렉션

에러 상황

just-coding-room.tistory.com

 

에러 상황

error.do로 무한 리다이렉션 된다
web.xml에 지정해놓은 대로 404가 계속 발생함
 

원인

style.css에 배경사진 경로가 지정되어 있는데 그 사진을 삭제해서 파일을 못 찾았음

 

해결방안

사진 파일을 동일한 이름으로 위치 시키니 배경 사진이 돌아옴과 함께 문제 해결

메인 화면
제품 전체 목록 화면
제품 상세 정보 화면
장바구니 화면
구매 화면
구매 - 쿠폰 선택 화면
구매 완료 화면
로그인 화면
마이페이지 - 초기 화면
마이페이지 - 개인 정보 수정 화면
마이페이지 - 구매 내역 화면
마이페이지 - 쿠폰 내역 화면
마이페이지 - 리뷰 내역 화면
마이페이지 - 리뷰 작성 화면
마이페이지 - 리뷰 상세 정보 화면
에러페이지 화면

 

에러 상황

에러 상황

 

모델

M SQL DAO

인자로 DTO

인자로 들어오는 DTO를 임의로 바꾸거나 값을 변경하면 안됨 => Ctrl가 DAO 진입 전에 전부 세팅해줘야 함!

 

V .jsp

JAVA가 보이면 안됨!

EL JSTL 커스텀태그

 

1. VC .jsp 같이 어떤 페이지를 보여주는 용도의 Action이 존재

2. MC 특정 DB의 데이터를 사용하는 용도의 Action이 존재

회사마다 스타일이 다르지만 우리 프로젝트에서는 MC는 사용 빈도가 높지 않으면 굳이 별도로 만들지 않음

1. 목적과 활용

싱글톤 패턴은 어떤 클래스가 단 하나의 인스턴스만을 갖도록 하고, 그 인스턴스에 대한 전역적인 접근을 제공하는 디자인 패턴입니다

이는 특정 객체가 시스템 전체에서 공유되어야 하거나, 유일한 자원을 효율적으로 활용해야 하는 경우에 유용하게 쓰입니다

예를 들어, 데이터베이스 연결, 로깅, 설정 관리 등의 경우에 싱글톤 패턴이 적용될 수 있습니다

 

2. 싱글톤의 특징

유일한 인스턴스

싱글톤 패턴을 사용하는 클래스는 인스턴스가 하나뿐이어야 합니다

이는 private 생성자를 통해 외부에서의 객체 생성을 막고, 유일한 인스턴스를 유지함으로써 달성됩니다

 

전역적인 접근

어디서든지 해당 인스턴스에 접근 가능해야 합니다

이는 주로 `getInstance()`와 같은 정적 메서드를 통해 구현되며, 이 메서드를 통해 언제든지 유일한 인스턴스에 접근할 수 있습니다

 

3. 초기화 시점

즉시 초기화

클래스 로딩 시점에 인스턴스를 생성하는 방식입니다

단점으로는 애플리케이션이 시작될 때 무조건 인스턴스가 생성되므로, 불필요한 자원 소모가 발생할 수 있습니다

 

늦은 초기화

인스턴스가 필요한 시점에 생성하는 방식입니다

하지만 멀티스레딩 환경에서는 동기화 문제로부터 안정성을 보장하기 위해 추가적인 처리가 필요합니다

 

4. 멀티스레딩과의 대응

멀티스레딩 환경에서는 여러 스레드가 동시에 인스턴스를 생성하려는 시나리오가 발생할 수 있습니다

이를 해결하기 위해 동기화 처리가 필요하며, 이로 인한 성능 저하를 최소화하기 위해 더블 체크 락킹 등의 기법을 활용할 수 있습니다

 

 

팩토리 패턴의 개념

팩토리 패턴은 객체를 생성하는 인터페이스를 정의하고, 이를 통해 객체의 생성을 캡슐화하는 패턴입니다

즉, 어떤 클래스의 인스턴스를 만들지에 대한 결정을 서브클래스에 위임하는 것입니다

이는 객체의 생성과 사용을 분리함으로써 코드의 유연성을 향상시킵니다

 

구성 요소

1. 제품 인터페이스 (Product Interface)

팩토리 패턴에서 생성될 객체들의 공통 인터페이스를 정의합니다

이 인터페이스를 통해 클라이언트 코드는 구체적인 제품의 클래스를 알 필요 없이 해당 제품을 사용할 수 있습니다

 

2. 제품 클래스 (Product Class)

팩토리 패턴에서 생성될 구체적인 제품 클래스들을 구현합니다

이 클래스들은 공통된 제품 인터페이스를 따라야 합니다

 

3. 팩토리 인터페이스 (Factory Interface)

객체 생성을 위한 인터페이스를 정의합니다

이 인터페이스에는 객체를 생성하는 메서드가 선언되어 있습니다

 

4. 팩토리 클래스 (Factory Class)

객체의 생성을 책임지는 클래스로, 팩토리 인터페이스를 구현합니다

이 클래스에서는 어떤 구체적인 제품 클래스의 인스턴스를 생성할지를 결정합니다

 

팩토리 패턴의 장점

1. 객체 생성의 캡슐화

클라이언트 코드는 객체의 생성 방식을 알 필요가 없으며, 단지 팩토리 인터페이스를 통해 객체를 생성할 수 있습니다

이로써 객체 생성의 세부사항이 숨겨지고 유지보수가 용이해집니다

 

2. 클라이언트 코드의 단순화

클라이언트 코드에서는 구체적인 제품 클래스를 직접 참조하지 않고, 팩토리 인터페이스를 통해 객체를 생성하므로 코드가 단순해집니다

 

3. 확장성과 유연성

새로운 제품 클래스를 추가하거나 기존 클래스를 변경하지 않고도 팩토리 클래스를 확장하여 새로운 객체를 생성할 수 있습니다

 

// 제품 인터페이스
interface Product {
    void doSomething();
}

// 제품 클래스 1
class ConcreteProduct1 implements Product {
    public void doSomething() {
        System.out.println("Product 1 is doing something.");
    }
}

// 제품 클래스 2
class ConcreteProduct2 implements Product {
    public void doSomething() {
        System.out.println("Product 2 is doing something.");
    }
}

// 팩토리 인터페이스
interface Factory {
    Product createProduct();
}

// 팩토리 클래스 1
class ConcreteFactory1 implements Factory {
    public Product createProduct() {
        return new ConcreteProduct1();
    }
}

// 팩토리 클래스 2
class ConcreteFactory2 implements Factory {
    public Product createProduct() {
        return new ConcreteProduct2();
    }
}

// 클라이언트 코드
public class Client {
    public static void main(String[] args) {
        Factory factory1 = new ConcreteFactory1();
        Product product1 = factory1.createProduct();
        product1.doSomething();

        Factory factory2 = new ConcreteFactory2();
        Product product2 = factory2.createProduct();
        product2.doSomething();
    }
}

CDN(콘텐츠 전송 네트워크)는 현대 웹 개발에서 빠질 수 없는 중요한 요소 중 하나입니다

이 글에서는 CDN이 무엇이며, 프로그래밍 세계에서 어떻게 활용되고 있는지에 대해 알아보겠습니다

 

CDN이란?

CDN은 콘텐츠 전송 네트워크(Content Delivery Network)의 약어로, 전 세계 여러 지역에 분산된 서버 네트워크를 통해 웹 콘텐츠를 더 효율적으로 전달하는 기술입니다

이는 웹 페이지의 성능을 향상시키고, 사용자에게 빠르고 안정적인 경험을 제공하는 데 도움이 됩니다

 

CDN의 장점

  1. 로드 타임 감소: CDN은 사용자에게 가까운 서버를 사용하여 웹 페이지의 로드 타임을 감소시킵니다
  2. 대역폭 최적화: CDN은 대역폭을 효율적으로 사용하여 서버 부하를 분산시키고, 빠른 데이터 전송을 지원합니다
  3. 보안 강화: 일부 CDN은 보안 기능을 내장하고 있어 DDoS 공격 등을 방어하는 데 도움이 됩니다
  4. 고가용성 및 신뢰성: CDN은 여러 지역에 서버를 분산시키므로 단일 서버의 장애가 전체 서비스에 영향을 미치는 것을 방지합니다

 

프로그래밍에서의 CDN 활용

  1. 정적 파일 제공: CDN은 주로 정적 파일(이미지, 스타일시트, 자바스크립트 등)을 더 빠르게 제공하기 위해 사용됩니다. 프로그래머는 웹 애플리케이션에서 이러한 파일들을 CDN을 통해 쉽게 호스팅하고 활용할 수 있습니다
  2. 라이브러리 및 프레임워크 로딩: 많은 프레임워크와 라이브러리는 CDN을 통해 호스팅되어 있어, 프로그래머들은 이를 활용하여 라이브러리를 더 빠르게 로딩할 수 있습니다. 예를 들면, jQuery나 Bootstrap과 같은 라이브러리를 CDN을 통해 불러올 수 있습니다
  3. 동적 컨텐츠 캐싱: 일부 CDN은 동적 컨텐츠까지 캐싱하여 동적 데이터의 전송 속도를 향상시킵니다. 이는 프로그래밍에서 동적인 내용을 가진 웹 애플리케이션에서 특히 유용합니다

API 인증키 받기

아래 사이트에서 회원가입 후 로그인

 

https://console.coolsms.co.kr/oauth2/login

 

COOLSMS - 알림톡과 문자메시지 발송, 최고의 안정성

 

console.coolsms.co.kr

 

우측 상단에 '개발/연동'에 'API Key 관리' 클릭

'새 API KEY 생성' 클릭

 

SDK 다운 받기

우측 상단에 '개발/연동'에 'SDK 다운로드' 클릭

 

Java용 SDK에서 '자세히' 클릭

'약관 동의 후 SDK 다운로드' 클릭

 

다운 받은 파일 압축을 해제하면 위와 같은 파일이 있음

우리는 'maven-spring-demo'를 활용할 예정

 

이클립스에 Spring 설치하기

상단 'Help'에 'Eclipse Marketplace...' 클릭

 

'spring' 검색하고 'install' 클릭

 

기존 프로젝트 Maven 프로젝트로 변경 및 pom.xml 수정

프로젝트에서 우클릭 후 'Configure' 선택 후 'Convert to Maven Project' 클릭

안내창 뜨면 'finish' 클릭

 

pom.xml 파일이 잘 생성됐는지 확인

 

아까 다운 받은 sdk에서 pom.xml을 프로젝트의 pom.xml에 복붙

 

예제 실행

이 페이지에 나온 예제를 활용해서 테스트

https://developers.coolsms.co.kr/sdk-list/Java/send-message

 

메시지 발송 예제 | Documents for COOLSMS Developers

해당 페이지에서는 COOLSMS Java/Kotlin SDK를 이용하여 메시지를 발송하는 방법에 대해 가이드하고 있습니다.

developers.coolsms.co.kr

 

저는 아래 코드에서 테스트 해봤습니다

DefaultMessageService messageService =  NurigoApp.INSTANCE.initialize("API 키 입력", "API 시크릿 키 입력", "https://api.coolsms.co.kr");
// Message 패키지가 중복될 경우 net.nurigo.sdk.message.model.Message로 치환하여 주세요
Message message = new Message();
message.setFrom("계정에서 등록한 발신번호 입력");
message.setTo("수신번호 입력");
message.setText("SMS는 한글 45자, 영자 90자까지 입력할 수 있습니다.");

try {
  // send 메소드로 ArrayList<Message> 객체를 넣어도 동작합니다!
  messageService.send(message);
} catch (NurigoMessageNotReceivedException exception) {
  // 발송에 실패한 메시지 목록을 확인할 수 있습니다!
  System.out.println(exception.getFailedMessageList());
  System.out.println(exception.getMessage());
} catch (Exception exception) {
  System.out.println(exception.getMessage());
}

위 코드를 main 함수가 있는 java 파일에 넣고

"API 키 입력", "API 시크릿 키 입력", "계정에서 등록한 발신번호 입력", "수신번호 입력"

위 4가지 요소만 수정해서 테스트 하니까 바로 동작했습니다

 

깃을 사용해서 협업하면서 양쪽에서 commit을 진행해 충돌이 나는 경우가 있다

이번 팀프로젝트에서 팀원이 이런 일을 겪었고 소스트리에서의 해결방안을 정리해 봤다

 

문제 상황

문제 상황

 

브랜치 이미지

소스트리에서 보면 위와 같이 로컬의 main 브랜치와 원격의 origin/main 브랜치가 갈라진 걸 볼 수 있다

이 경우에는 갈라지는 부분의 커밋 (현재는 '[CTRL] CheckPw 서블릿 삭제' 커밋)으로 되돌려야 한다

이 과정에서 본인이 작업한 내용은 삭제되니, 작업한 파일을 깃 외부에 복사해 두자

 

해결 방안

 

되돌리고 싶은 커밋 위에서 우클릭을 하고 'main 를 이 커밋으로 초기화'를 선택한다

위와 같은 창이 뜨면 모드를 Hard로 선택한다

모드에 따라 되돌리는 방식이 달라지는데 Hard는 진짜 모든 걸 되돌린다는 뜻이다

(== 내 작업을 삭제하고 완전히 선택한 commit 시점으로 되돌림)

작업을 삭제하는 위험한 작업이기에 경고창이 한 번 뜬다

확인을 클릭

이렇게 하면 내 main 브랜치가 되돌린 commit 위치로 갔음을 확인할 수 있다

이 상태에서 pull 해주면 원격에 origin/main 브랜치와 같은 위치로 갈 수 있고

이제 아까 외부에 복사해 둔 파일을 보고 다시 작업을 하고 푸쉬를 하면 된다

시맨틱 태그는 웹 페이지의 구조를 명확하게 정의하고 의미를 부여하여 검색 엔진이나 웹 브라우저, 보조 기술과 같은 도구들이 페이지를 더 잘 이해하고 해석할 수 있도록 돕습니다

각각의 시맨틱 태그는 특정한 역할과 의미를 가지고 있습니다

 

1. <header>

웹 페이지 상단의 헤더를 정의합니다

사이트 로고, 주요 내비게이션 링크, 검색 폼 등을 포함합니다

페이지의 전체적인 정보를 요약하고 사용자에게 핵심 내용을 제공합니다

 

2. <nav>

내비게이션 영역을 정의합니다

메뉴, 링크 목록 등을 포함합니다

사용자가 사이트 내에서 쉽게 이동할 수 있도록 돕습니다

 

3. <article>

독립적인 컨텐츠 블록을 정의합니다

블로그 글, 뉴스 기사, 포럼 글 등을 포함합니다

단일한 주제나 컨텐츠를 표현하며, 독립적으로 배포하거나 재사용할 수 있는 단위입니다

 

4. <section>

문서의 섹션을 정의합니다

주제에 따라 그룹화된 콘텐츠를 나타냅니다

관련 있는 내용을 그룹화하여 나타내어 문서의 구조를 명확하게 합니다

 

5. <footer>

웹 페이지의 하단, 저작권 정보, 연락처, 사이트 링크 등을 포함하는 부분을 정의합니다

페이지의 부가 정보를 담고 있습니다

 

6. <aside>

주요 콘텐츠와는 상관없는 부가적인 정보를 정의합니다

사이드바, 광고 영역, 관련 링크 목록 등을 포함합니다

페이지의 주요 내용과는 독립적으로 추가 정보를 제공합니다

 

7. <main>

문서의 주요 콘텐츠를 정의합니다

주요 글, 제품 목록, 주문 양식 등을 포함합니다

페이지의 핵심적인 내용을 담고 있으며, 다른 시맨틱 태그들로 둘러 쌓여 있습니다

 

예시

<header>
    <!-- 로고, 메인 내비게이션 등을 포함하는 페이지 상단의 헤더 -->
</header>

<nav>
    <!-- 메뉴, 링크 목록 등을 포함하는 내비게이션 영역 -->
</nav>

<main>
    <article>
        <!-- 독립적인 컨텐츠 블록 (블로그 글, 뉴스 기사 등) -->
    </article>

    <section>
        <!-- 문서의 섹션을 그룹화하여 나타내는 영역 -->
    </section>

    <aside>
        <!-- 주요 콘텐츠와는 상관없는 부가적인 정보 (사이드바, 광고 영역 등) -->
    </aside>
</main>

<footer>
    <!-- 페이지의 하단을 정의하며, 저작권 정보, 연락처, 사이트 링크 등을 포함 -->
</footer>

 

 

이러한 시맨틱 태그를 적절히 활용하면 웹 페이지의 구조가 명확해지고, 검색 엔진 최적화(SEO)나 웹 접근성을 향상시킬 수 있습니다

또한, 코드의 가독성과 유지보수성을 높이는데에도 기여합니다

Scope는 프로그래밍에서 변수나 함수 등이 유효한 범위를 나타내는 개념으로, 웹 개발에서도 중요한 역할을 합니다

특히 웹 개발에서는 주로 세 가지 범위 Request, Session, Application이 활용됩니다

 

1. Request Scope

Request Scope는 특정 HTTP 요청 내에서만 변수나 객체가 유효한 범위입니다

각각의 HTTP 요청은 서로 독립적이므로, 한 요청에서 설정한 변수는 같은 요청 내에서만 접근이 가능합니다

 

사용자의 요청에 대한 정보를 저장하거나 전달할 때 사용합니다

한 번의 요청에서만 필요한 데이터를 임시로 저장할 때 활용합니다

 

2. Session Scope

Session Scope는 사용자가 웹 애플리케이션에 접속한 시점부터 로그아웃하거나 세션이 만료될 때까지 변수나 객체가 유효한 범위입니다

각각의 사용자는 별도의 세션을 가지며, 세션은 일반적으로 세션 쿠키를 통해 식별됩니다 

 

사용자 로그인 정보 유지

장바구니나 사용자 환경 설정과 같은 사용자별 정보 저장

 

3. Application Scope

Application Scope는 웹 애플리케이션이 시작되고 종료될 때까지 변수나 객체가 유효한 범위를 나타냅니다

모든 사용자가 공유하는 전역적인 범위로, 애플리케이션의 생명주기와 일치합니다

 

모든 사용자에게 공통적으로 적용되는 설정 정보

애플리케이션 전역에서 사용되는 공유 데이터

+ Recent posts