2015년 자바의 웹 개발

요즘 Java에 있어요?
예전에 서브렛과 JSP가 했었는데...Seasar2는 감동했지. 이런 추억이 떠오르면 자바는 J2EE, 자바는 5.0 정도면 멈출 수밖에 없어.
※ 씨스타2는 2016년 9월 26일 지원 중단입니다.OSS이기 때문에 포크와 유지보수가 계속될 수도 있지만 시대적 단계라고 생각한다.
그 이후로 자바도 끊임없이 진화했다. 최신판 자바이7.0 다른 언어 틀에 뒤지지 않는 생산성.
자바가 아직도 놀고 있기 때문인지 2013년 발매됐음에도 불구하고 자바이7은 시대가 너무 길다.0에 대한 보도는 충실하다고 할 수 없다.다만, 그 구조에 아주 좋은 것이 있기 때문에 이것을 기회로 삼고 싶다면 오랜만에 자바도 행운을 시도해 보세요.
※ 2017/9/21, 여러 가지 일이 있었지만. 드디어JavaEE 8 나왔습니다! 자바이8에 기반한 기사 공개를 검토 중입니다.
이번 기술 실습은 사전 조사 내용을 바탕으로 샘플 코드를 아래에 놓았다.위키에는 참고자료가 붙어 있어 실제 제작 시 참고가 됐으면 합니다.
JavaEE7App
또 기재된 분량을 보면 한눈에 알 수 있지만, EJB/JPA는 이번에 사용하지 않아 자세히 접하지 못했다.그거 포함해서, JavaE7.0의 기능에 대하여 아래의 총결은 매우 좋으니 참고하시오.
자바이 가자!

JavaEE7.0의 프레임


JavaEE7 애플리케이션은 대체로 다음과 같습니다.

JSF/Backing Bean


이전 JSP/Servlet 대신 JSF/Backing Bean을 사용한 것은 JavaE7 입니다.0은 표준입니다(물론 서브렛/JSP에서도 사용할 수 있습니다).
JSF/Backing Bean은 View 모델형의 자바스크립트 프레임처럼 느껴지는데 Backing Bean이 정의한 대상을 JSF에 간단하게 연결할 수 있다. 구체적으로 x>가 제작한 화면이다.
JSF 측
<h:dataTable value="#{IndexBean.hotels}" var="h">
    <h:column>#{h.hotelName}</h:column>
    <h:column>#{h.latitude}</h:column>
    <h:column>#{h.longitude}</h:column>
</h:dataTable>

Backing Bean 측.
@Named("IndexBean")
@RequestScoped
public class IndexBean implements Serializable{

    private ArrayList<Hotel> hotels = new ArrayList<Hotel>();

    public ArrayList<Hotel> getHotels() {
        return hotels;
    }

    public void setHotels(ArrayList<Hotel> hotels) {
        this.hotels = hotels;
    }

}
이렇게 하면 화면과 서버의 대상을 간단하게 연결할 수 있다.서버뿐만 아니라 형식 등에서 받은 콘텐츠도 백킹빈으로 바인딩할 수 있다.
JSF에 대한 내용은 신구가 섞여 있어 찾아보기 힘들다는 내용을 요약해 봤다.
JSF2.2 의 일본어 메시지를 정리해 보도록 하겠습니다.
여기서 Java는 Getter/Setter를 하나씩 써야 합니까?너무 귀찮아요!이런 분Lombok이 계시니 안심하세요.Lombok으로 쓰면 다음과 같은 내용을 쓸 수 있다.
import lombok.Getter;
import lombok.Setter;

@Named("IndexBean")
@RequestScoped
public class IndexBean implements Serializable{
    @Getter @Setter private ArrayList<Hotel> hotels = new ArrayList<Hotel>();
}
모조를 추가하여 자동으로 생성됩니다.잘, Eclipse 등의 통합 개발 환경에서도 코드 보완getHotels 등이 제시됐다.이렇게 되면 모델에 사용되는 POJO(Plaain Old Java Object, 어쨌든 일반적인 Java 레벨)도 간단해진다.
@Data
public class Hotel {
    private String hotelNo = "";
    private String hotelName = "";
    private double latitude = 0;
    private double longitude = 0;
}

단순한 구조로 사용되는 반은 더 이상 Getter/Setter를 추가할 필요가 없다.@Data여기서 마치겠습니다.
물론 Lombok과 JavaEE는 상관없지만 2015년에 Java를 쓰려면 반드시 이 라이브러리를 사용해야 한다.

JAX-RS


JAX-RS는 RESTful 서비스를 실현하기 위한 메커니즘이다.JSF는 화면을 만드는 것은 매우 편리하지만 화면 구성 요소로 조립하는 형식이기 때문에 자바스크립트 측의 처리와 연합하면 매우 번거롭다.
이 경우 JAX-RS를 통해 서버 측 처리 네트워크를 서비스화하고 JavaScript 측과 좋은 협력을 할 수 있다.
다음은 호텔 일람을 얻는 처리find와 각 호텔의 상세한 정보를 얻는 처리get를 인상으로 하는 샘플 코드입니다.
@Path("/hotels")
public class HotelService {

    @GET
    @Path("/find")
    @Produces({ "application/json" })
    public Hotel[] find(
            @DefaultValue("0.0") @QueryParam("lat") double lat, 
            @DefaultValue("0.0") @QueryParam("lng") double lng){

        ArrayList<Hotel> hotels =  RakutenTravelApi.findHotels(lat, lng);
        return hotels.toArray(new Hotel[hotels.size()]);
    }

    @GET
    @Path("/{hotelNo}")
    @Produces({ "application/json" })
    public Hotel get(@PathParam("hotelNo") String hotelNo){        
        return RakutenTravelApi.getHotelInfo(hotelNo).orElse(new Hotel());
    } 
}
어때?보기만 해도 처리가 인상적일 것 같다.
요청에 따라 대응하는 요청 종류@GET, 서비스 경로@Path, 응답 유형@Produces을 지정하면 쓰기 중인 처리만 남습니다.매개 변수는 조회 매개 변수@QueryParam로 경로에서 가져오면@PathParam 모조를 통해 지정할 수도 있고@DefaultValue 기본값에 추가할 수 있습니다.
리턴을 할 때 특별한 변환을 할 필요가 없다. 위의 예에서 자바 대상은 일반적으로 반환되지만 요청을 보내면 JSON 대상이 되어 반환된다.이것은 만들기에 매우 편하다.
JAX-RS는 웹 서비스뿐만 아니라 호출 클라이언트의 설치도 포함한다.이렇게 되면 서버 내에서 웹 API를 호출하는 처리도 아래와 같이 간단하게 쓸 수 있다.
String url = "http://xxxxx";
Client client = ClientBuilder.newClient();
WebTarget target = client.target(URI.create(url));
String response = target.request().get(String.class);
JAX-RS에 대한 자세한 내용은 다음과 같이 이해하기 쉽다.
  • Java 기술로 RESTful의 웹 서비스를 제작(2010년보다 조금 낡았다)
  • Chapter 3. JAX-RS Application, Resources and Sub-Resources
  • EJB


    쓰기 서비스, 상업 논리의 좋은 구조입니다.비동기적으로 실행하고 싶은 처리 등을 간단하게 쓸 수 있다.

    JPA


    Java 버전 O/R 맵과 같은 기능이기 때문에 JDBC를 사용할 때 대상을 제거하는 취득/저장이 매우 쉽다.

    개발 환경


    JavaEE의 개발 환경을 미리 알아보겠습니다.
    개발 환경은 일반적인 자바와 다르지 않기 때문에 Eclipse/NetBeans/IDEA를 기준으로 하지만 IDEA는 무료 버전인 상황에서 자바의 웹 응용 개발에 대한 지원이 약하기 때문에 Eclipse나 NetBeans가 좋다고 생각합니다(자바8에 대응하는 것을 포함하면 NetBeans에 설정을 추가할 수 있습니다).
    프로젝트 형태로는 통상 메이븐이나 그레이드...이지만 개인적으로는 처음 하는 게 아니라 오랜만에 하면 웹 프로젝트부터 시작하는 게 좋다.Maven/Gradle을 접하면 자바를 싫어할 확률이 높기 때문이다.나는 이 일대의 포장 관리가 다른 언어처럼 그렇게 진보하지 않아서 반드시 이런 번거로움에 놀랄 것이라고 생각한다.
    처음 웹 프로젝트부터 시작해도 Eclipse라면 중간에 마븐/Gradle 프로젝트로 전환할 수 있고, 필요하면 전환하면 된다.자바이7은 단일체로 충분히 개발할 수 있기 때문에 다양한 프로그램 라이브러리에 넣지 않으면 진전이 없다.
    이번에 그랜드 프로젝트로 최종 전환됐지만, 자바이7 개발 당시최소 스크립트인 만큼 참고가 됐으면 한다.

    가동 환경


    JavaEE7을 이동할 수 있는 것은 JBoss가 현재 개발 중Wildfly이나 OracleGlassfish이다.
    가서 JavaEE를 떨어뜨리면... 부탁을 안 했는데 글래스피쉬가 떨어졌어요.'여보세요'라고 생각할 수도 있어요.이것은 Oracle의 전략이 아니다.JavaEE7은 사실상 규격이다. 왜냐하면 그 실시가 Wildfly와 Glassfish의 관계가 되었기 때문이다. 참고로 실시의 하나인 Glassfish가 Oracle에서 떨어졌기 때문이다.
    그래서 처음에는 되돌아왔지만 자바이7의 개발은 그 실현된 윌드플라이나 글래스피쉬가 필요하다.JavaEE7을 처음 접하게 되면 본격적으로 실시하는 글래스피쉬가 좋을 것 같아요.다만, GlassfishCommercial Edition 중단는 비즈니스 지원을 받으면 WebLogic을 사용하라는 것이 Oracle씨의 입장이다.
    저는 개인적으로 갑골문 선생을 DB 쪽에서도 배려를 받았습니다. 물론 개발 환경은 Eclipse이고 운영 환경은 Wildfly입니다.다만, 정식 참조 실장인 만큼 글래스피쉬로 이동하면서 와일드플라이가 움직이지 못하는 경우도 있다(이번 샘플도 jax-ss의 셀리언트 교부 대행 설정에 제대로 이뤄지지 않아 결국 장이 끊어진 심정으로 글래스피쉬에서 작동을 확인했다).
    그럼 자바를 쓰고 싶으세요?
    요즘은 역시 스타일리시한 언어로 창작하고 싶어 그 용기를 접해 진화한 자바를 시도해 보는 것도 좋다.

    좋은 웹페이지 즐겨찾기