23.04.10(Spring)

MH S·2023년 4월 10일

Spring

목록 보기
2/13

개발 환경 다운로드

https://www.jetbrains.com/ko-kr/idea/download/#section=windows

Community Edition 다운

설치시 Open Folder as Project 체크



플러그인 설치

korean

translation

설정

시스템 설정 -> 시작 시 프로젝트 다시 열기 체크 해제

일반 - > ctrl+ 마우스 휠로 다음 위치의 글꼴 크기 변경 체크 하기

단축키

control + 방향키 : 글자단으로 이동하기 가능
control + shift + 방향키 : 블록 지정
control + w : 블록 지정 전체
pageDown, pageUp : 마우스 커서 위아래 컨트롤 가능
home, end : 마우스 커서 오른쪽, 왼쪽 컨트롤 가능
alt + 1 : 왼쪽 프로잭트 에디터 카테고리로 이돔
alt + 1 + esc : 에디터 카테고리에서 코드란으로 이동
카테고리에서 alt + insert : 새로운 프로젝트 생성
코드란에서 alt + 방향키 : 프로젝트 방향 이동 가능
control + f4 : 현재 프로젝트 끄기
control + shift + 방향키 : 마우스 위치의 코드를 위아래로 이동 가능
control + shift + z : control + z 반대
control + alt + o : 안쓰는 import(라이브러리) 지우기
control + alt + v : 자동 변수명 생성
shift + shitft : 검색 창
shift + f6 : 리펙터링(변수명 변경)

JSP 라이브러리 JSTL 이란?

일반적으로 알고있는 JSTL이란 JSTL + EL의 조합을 말한다.

HTML 코드 내에 java 코드인 스크립틀릿 <%= student %>를 ${student}로, <%=if %>문을 <c:if>, <%=for%>문을 <c:forEach>로 대체하여 사용한다.

예전에는 스크립틀릿을 많이 사용했지만 가독성이 떨어지고, 뷰와 비즈니스로직의 분리로 인해 현재는 JSTL을 많이 사용하는 추세다.

JSTL의 정식 명칭은 자바서버 페이지 표준 태그 라이브러리(JavaServer Pages Standard Tag Library)이고 줄여서 JSTL이라 부른다.

위키피디아를 참조하자면, JSTL은 Java EE 기반의 웹 애플리케이션 개발 플랫폼을 위한 컴포넌트 모음이다. JSTL은 XML 데이터 처리와 조건문, 반복문, 국제화와 지역화와 같은 일을 처리하기 위한 JSP 태그 라이브러리를 추가하여 JSP 사양을 확장했다.

JSTL은 JSP 페이지 내에서 자바 코드를 바로 사용하지 않고 로직을 내장하는 효율적인 방법을 제공한다. 표준화된 태그 셋을 사용하여 자바 코드가 들락거리는 것보다 더 코드의 유지보수와 응용 소프트웨어 코드와 사용자 인터페이스 간의 관심사의 분리로 이어지게 한다.

JSTL의 사용법

JSTL은 라이브러리이기 때문에 사용하기전에 core를 header에 추가해주어야 한다.

<% @taglib uri="http://java.sun.com/jstl/core" prefix="c" %>

사용방법은 다음과 같다.

<c:if test=""></c:if>
<c:forEach items=""></c:forEach>

JSTL core의 태그들

태그명 설명
<c:set> 변수명에 값을 할당
<c:out> 값을 출력
<c:if> 조건식에 해당하는 블럭과 사용될 scope설정
<c:choose> 다른 언어의 switch와 비슷
<c:when> switch문의 case에 해당
<c:otherwise> switch문의 default에 해당
<c:forEach> 다른언어의 loop문 items 속성에 배열을 할당할 수 있음


POJO 란?

POJO란 Plain Old Java Object의 약자로 다른 클래스나 인터페이스를 상속/implements 받아 메서드가 추가된 클래스가 아닌 일반적으로 우리가 알고 있는 getter, setter 같이 기본적인 기능만 가진 자바 객체를 말한다.

public class User {
    private int id;
    private String name;
    private String email;
    
    public int getId() {
    	return id;
    }
    public String getName() {
    	return name;
    }
    public String getEmail() {
    	return email;
    }
    
    public void setId(int id) {
    	this.id = id;
    }
    public void setName(String name) {
    	this.name = name;
    }
    public void setEmail(String email) {
    	this.email = email;
    }
}

위와 같은 클래스를 자바의 기본 객체라고 한다.

자바를 이용해 비즈니스 서비스를 개발할 때 비즈니스 로직 뿐만 아니라 트랜잭션, 보안 등 로우레벨의 로직까지 작성해야하는 부담감을 없애고자 EJB(Enterprise Java Beans)를 만들게 되었다. EJB를 사용하면서 로우레벨의 로직 개발에 대한 수고를 덜 수 있었지만, 한 두가지 기능을 사용하기 위해 거대한 EJB를 상속받거나 implements 하게 되어 가벼운 서비스조차도 무겁게 만들어졌고, 다른 기능으로 대체하기 위해선 전체 코드를 수정해야 하는 문제점이 발생하였다.

JAVA의 기본 개념인 객체지향에 집중하고, 특정 클래스나 라이브러리에 종속되지 않는 POJO 구성으로 코드를 작성한다면 이런 문제점을 해결할 수 있을 것이라고 생각했다.
따라서 Spring은 POJO 방식을 기반으로 한 웹 프레임워크이고, IoC와 DI, AOP 등 Spring의 주요 기술을 활용해 POJO 기반의 구성을 이루게 되었다.

자바 어노테이션(Annotation)의 구성 요소

Annotation은 프로그램 내에서 주석과 유사하게, 프로그래밍 언어에는 영향을 미치지 않으면서 프로그램/프로그래머에게 유의미한 정보를 제공하는 역할을 한다.

어노테이션이 등장하기 전에는 프로그램 소스코드와 프로그램 설정파일(대부분 .xml 형태)을 따로 작성했기 때문에, 코드와 설정파일 분리에 따른 어려움이 있었다.

예를 들어, @Test는 => Junit이라는 특정 프로그램에게 설정정보를 제공하기 위한 것이다.
또한 프로젝트를 여러 사람이 함께 할 경우 모든 프로그래머가 설정정보를 공유해야 하는데, xml파일을 사용할 경우 많은 사람이 하나의 xml 파일을 두고 사용하기 때문에 사용/수정하기에 어려움이 있었다.
어노테이션을 사용한다면 각자 자기가 맡은 부분에서 어노테이션을 사용하면 되므로 이와 같은 문제를 해결할 수 있다.

어노테이션의 사용 예

@Test // method()가 테스트 대상임을 JUnit 단위테스트 프로그램에게 알린다. 
public void method(){
}

@Test 어노테이션은 자체적인 프로그램에는 영향을 미치지 않으면서 method()가 테스트 대상임을 JUnit 단위 테스트 프로그램에 알린다.

자바 리플렉션이란?

리플렉션은 힙 영역에 로드된 Class 타입의 객체를 통해, 원하는 클래스의 인스턴스를 생성할 수 있도록 지원하고, 인스턴스의 필드와 메소드를 접근 제어자와 상관 없이 사용할 수 있도록 지원하는 API이다.

여기서 로드된 클래스라고 함은, JVM의 클래스 로더에서 클래스 파일에 대한 로딩을 완료한 후, 해당 클래스의 정보를 담은 Class 타입의 객체를 생성하여 메모리의 힙 영역에 저장해 둔 것을 의미한다. new 키워드를 통해 만드는 객체와는 다른 것임을 유의하자. 만약 해당 Class 타입의 객체에 이해가 부족하다면 java.lang.class 객체의 JDK 문서를 확인하면 좋다.

Maven 과 Gradle 을 쓰는 이유와 사용법

메이븐 이란?

아파치 메이븐은 자바용 프로젝트 관리 도구이다.
아파치 Ant의 대안으로 만들어졌다.
아파치 라이센스로 배포되는 오픈 소스 소프트웨어이다.
프로젝트를 진행하면서 사용하는 수많은 라이브러리들을 관리해주는 도구입니다.

여기서 메이븐의 특징적인 점은 그 라이브러리들과 연관된 라이브러리들까지 거미줄처럼 모두 연동이 되서 관리가 된다는 점입니다.

즉, 메이븐은 네트워크를 통해 연관된 라이브러리까지 같이 업데이트를 해주기 때문에 사용이 편리합니다.

Gradle 이란?

빌드, 프로젝트 구성/관리, 테스트, 배포 도구
안드로이드 앱의 공식 빌드 시스템
빌드 속도가 Maven에 비해 10~100배 가량 빠름
JAVA, C/C++M Python 등을 지원
빌트툴인 Ant Builder와 Groovy 스크립트 기반으로 만들어져 기존 Ant의 역할과 배포 스크립트의 기능을 모두 사용 가능

maven, gradle 차이점

  1. 스크립트 길이와 가독성 면에서 gradle이 우세하다.
  2. 빌드와 테스트 실행 결과 gradle이 더 빠르다. (gradle은 캐시를 사용하기 때문에 테스트 반복 시 차이가 더 커진다.)
  3. 의존성이 늘어날 수록 성능과 스크립트 품질의 차이가 심해질 것이다.

maven은 프로젝트가 커질수록 빌드 스크립트의 내용이 길어지고 가독성이 떨어집니다.
반면에 gradle은 훨씬 적은 양의 스크립트로 짧고 간결하게 작성할 수 있습니다.
maven이 정적인 형태의 XML 기반으로 작성되어 동적인 빌드를 적용할 경우 어려움이 많다면,
gradle은 Groovy를 사용하기 때문에 동적인 빌드는 Groovy 스크립트로 플러그인을 호출하거나 직접 코드를 짜면 됩니다.

maven의 경우 멀티 프로젝트에서 특정 설정을 다른 모듈에서 사용하려면 상속을 받아야 하지만,

gradle은 설정 주입 방식을 사용하기 때문에 멀티 프로젝트에 매우 적합합니다.


IoC, DI, AOP

IOC? Inversion of Control

즉, 제어의 역전이라고 부릅니다. 이 말이 뭐냐면.. 한마디로 프레임워크의 라이프사이클을 관리합니다.
쉽게말해 객체의 생성과 그 객체들의 관리까지 모두 관리한다는 개념인데, 기존에 자바 기반으로 어플리케이션을 개발할 때 자바 객체를 생성하고 서로간의 의존 관계를 연결시키는 작업에 대한 제어권은 보통 개발되는 어플리케이션에 있었는데 IOC 컨테이너는 객체의 생성, 초기화, 서비스 소멸에 관한 모든 권한을 가지면서 객체의 생명주기를 관리합니다 이것을 제어권이 역전되었다해서 IOC라고 부릅니다.

AOP? Aspect Oriented Programming

관점지향프로그래밍이라고 부르는데,
우리가 개발을 하다보면 반복되는 작업들이 있습니다. 이것들의 공통 작업되는 것들을 모아서 필요한 적절한 시기에 적용하는 개념입니다.
따로 코드 밖에서 개발을 해두고 프록시개념으로 메서드가 실행되기전, 실행된 직후, 실행시점에 따라 따로 기능을 적용 시키는 것입니다.

DI? Dependency Injection

의존성 주입
객체 자체가 아니라 Framework에 의해 객체의 의존성이 주입되는 설계 패턴인데 IOC와 연결되는 개념입니다.
IOC의 제어권이 프레임워크에게 가게 되는것은 IOC 컨테이너는 DI를 통해 주입시키는데 주입하는 방법은 생성자,메소드의 setter, 멤버변수에 @Inject,@Autowired 를 통해 주입합니다.
이러한 방법으로 IOC 컨테이너에 의존성주입을 하는것을 DI라고 부릅니다.


서블릿 컨테이너와 서블릿

서블릿

서블릿(Servlet)은 클라이언트 요청을 처리하고, 그 결과를 반환하는 웹 프로그래밍 기술이다. 클라이언트가 요청을 하면 그에 대한 결과를 다시 전송해주는 역할을 자바 프로그램이 하는 것이다. 이전의 웹 프로그램들은 클라이언트의 요청에 대한 응답으로 만들어진 페이지를 넘겨주었다. 웹 프로그래밍이 점점 발전하면서 응답을 가공하여 동적인 페이지를 작성할 수 있게 되었다. 동적인 페이지를 제공하기 위해서는 웹서버가 다른 곳에 도움을 요청하여 동적인 페이지를 작성하게된다.

서블릿 컨테이너

서블릿 컨테이너는 스스로 동작하지 않는 서블릿을 관리해주는 컨테이너이다. 서블릿 컨테이너는 클라이언트의 요청을 받고 응답 할 수 있도록 웹 서버와 소켓으로 통신한다. 톰캣이 서블릿 컨테이너의 대표적인 예이다.

톰캣처럼 서블릿을 지원하는 WAS를 서블릿 컨테이너라 한다.
서블릿 객체를 생성, 초기화, 호출, 종료하는 생명주기 관리
서블릿 객체는 싱글톤으로 관리
동시 요청을 위한 멀티 쓰레드 처리 지원


스프링 컨테이너와 빈(Bean)

스프링 컨테이너

스프링 컨테이너는 스프링에서 자바 객체들을 관리하는 공간을 말합니다. 자바 객체를 스프링에선 빈(Bean)이라고 하는데, 스프링 컨테이너에서는 이 빈의 생성부터 소멸까지를 개발자 대신 관리해주는 곳이라고 할 수 있습니다.

컨테이너는 크게 두 종류로 나눌 수 있습니다. 하나는 BeanFactory이고, 다른 하나는 ApplicationContext입니다. ApplicationContext컨테이너가 BeanFactory의 기능을 포괄하면서 추가적인 기능을 제공하기 때문에 대부분의 경우에는 ApplicationContext를 사용합니다.

그렇다면 어떤 부분이 ApplicationContext에 추가가 되었을까요? 이벤트 발행 및 구독 모델 지원 및 리소스 조회 편의성 제공, 환경변수를 구분해주는 기능 및 언어 국제화를 지원합니다.

스프링 컨테이너에 객체, 빈을 등록하는 이유는 스프링이 각 객체간 의존관계를 관리하도록 하는데에 큰 목적이 있습니다. 객체가 의존관계를 등록할 때는 스프링 컨테이너에서 해당하는 빈을 찾고, 그 빈과 의존성을 만듭니다.

@Controller
public class MemberController {

    private final MemberService memberService;

    @Autowired
    public MemberController(MemberService memberService) {
        this.memberService = memberService;
}

@Service
public class MemberService {

    private final MemberRepository memberRepository;
    ...
}

위의 코드와 같이 MemberController 클래스에는 @Controller Annotation을, 그리고 생성자에 @Autowired를 적어두면, 이 인스턴스는 MemberService와 의존관계를 가진다는 의미를 줍니다.
단, @Autowired가 정상적으로 동작하려면 두 인스턴스가 빈으로써 스프링 컨테이너에 들어가있어야 합니다.

ApplicationContext의 구현체로는 AnnotationConfigApplicationContext()가 있습니다. AnnotationConfigApplicationContext의 매개변수에 구성정보로 AppConfig.class와 같은 Bean을 정의한 @Configuration 클래스를 넣어주면 됩니다.

스프링 빈

스프링은 보통의 경우 스프링 컨테이너에 빈 인스턴스를 단 한개만 저장하는 싱글톤 방식을 채택하고 있습니다. 빈 이름은 항상 다르게 지정이 되어야 합니다. 예상치 못한 여러 오류가 발생하는데, 이를 개발 중 발견하기 매우 어렵기 때문입니다. 스프링 빈을 등록하는 방법은 크게 2가지로 나뉩니다.

1.컴포넌트 스캔
@Component Annotation을 통해 가능한데, 이 외에도 스프링 프레임워크에서 제공하는 @Controller나 @Service 혹은 @Repository와 같은 Annotation은 아래와 같이 인터페이스로 @Component Annotation을 받기 때문에 컴포넌트 등록이 가능합니다.

...
@Component
public @interface Service {
	...
}

단, 실행되는 패키지와 같은 패키지에 있는 클래스에 대해서만 @Component Annotation이 적용됩니다.


2.스프링 빈 직접 등록 스프링 빈을 직접 등록하는 것은 @Configuration과 @Bean Annotation으로 가능합니다.
@Configuration
public class SpringConfig {
   @Bean
   public MemberService memberService() {
       return new MemberService(memberRepository());
   }
}


TCP SCHOOL 사이트 실습

JQuery

Ajax

이클립스에서 Lombok 사용법

자바 eclipse lib 폴더에있는 Lombok 라이브러리 확인

  1. Lombok 경로를 찾아서 cmd 를 관리자 권한으로 켜서 cd 명령어를 써서 lombok 위치로 경로를 바꾼다.

  1. java -jar "론북 파일명" 명령어를 입력해서 실행

  2. 실행시 다음과 같은 화면이 뜨고 eclipse 경로를 찾아서 install 한다.
    install 성공시 다음과 같이 install successfull이 뜬다.

Tip

보통 WEB-INF 안에 만든 프로젝트 파일을 넣어야 비밀성이 보장됨.

0개의 댓글